我有两个结构相同的 Entity Framework 模型,它们是使用 Oracle DB 中的 Code First 生成的(2 个“双胞胎”表,请不要问为什么,我无法控制 DB)。
我一直在寻找一种使用 Linq 的有效方法,试图避免两次重写相同的查询。
一些例子:
[Table("ORACLE.TABLE1")]
public partial class MyModel1
{
[Key]
[Column(Order = 0)]
[StringLength(3)]
public string field1 { get; set; }
[Key]
[Column(Order = 1)]
[StringLength(3)]
public string field2 { get; set; }
[Key]
[Column(Order = 2)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int field3 { get; set; }
// -- many other fields
}
[Table("ORACLE.TABLE2")]
public partial class MyModel2
{
[Key]
[Column(Order = 0)]
[StringLength(3)]
public string field1 { get; set; }
[Key]
[Column(Order = 1)]
[StringLength(3)]
public string field2 { get; set; }
[Key]
[Column(Order = 2)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int field3 { get; set; }
// -- many other fields, same as above
}
在某个地方,我有:
public virtual DbSet<MyModel1> MyModel1s { get; set; }
public virtual DbSet<MyModel2> MyModel2s { get; set; }
我目前获取数据的简单且丑陋的解决方案是这样的:
var result1 = from t in db.MyModel1s
where t.field1 == myparameter1
&& t.field2 == myparameter2
&& t.field3 == myparameter3
select t;
var result2 = from t in db.MyModel2s
where t.field1 == myparameter1
&& t.field2 == myparameter2
&& t.field3 == myparameter3
select t;
var result = result1.ToList();
...最后...
foreach (var res2 in result2)
{
var m1 = new MyModel1
{
field1 = res2.field1,
field2 = res2.field2,
field3 = res3.field3
};
result.Add(m1);
}
现在结果
包含我想要的所有内容。
一定有更好的方法,建议吗?
最佳答案
您可以使用 Concat
扩展方法执行类似的操作,这相当于 SQL 中的 UNION ALL
:
var result= db.MyModel1s.Where(m=>m.field1 == myparameter1
&& m.field2 == myparameter2
&& m.field3 == myparameter3)
.Select(t=>new MyModelDTO
{
field1 = t.field1,
field2 = t.field2,
field3 = t.field3
}
)
.Concat( db.MyModel2s.Where(t=> t.field1 == myparameter1
&& t.field2 == myparameter2
&& t.field3 == myparameter3)
.Select(t=>new MyModelDTO
{
field1 = t.field1,
field2 = t.field2,
field3 = t.field3
}
)
).ToList();
这样您就可以在数据库的一次往返中获得结果。如果您想避免重复,请改用 Union
扩展方法。
现在,如果您不想将两个查询都投影到一个公共(public) DTO,那么您将需要对数据库进行两次往返并在内存中进行合并:
var result= db.MyModel1s.Where(m=>m.field1 == myparameter1
&& m.field2 == myparameter2
&& m.field3 == myparameter3)
.AsEnumerable()// Calling the method you will call Concat extension method from IEnumerable<T> type
.Concat( db.MyModel2s.Where(t=> t.field1 == myparameter1
&& t.field2 == myparameter2
&& t.field3 == myparameter3)
.Select(t=>new MyModel1
{
field1 = t.field1,
field2 = t.field2,
field3 = t.field3
}
)
).ToList();
关于c# - Entity Framework 6 + Oracle如何查询两个结构相同的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39252660/