[英]Entity Framework 6 + Oracle how to query two tables which are identical in structure
我有两个结构相同的实体框架模型,它们是使用Code First从Oracle DB中生成的(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);
}
现在result
包含了我想要的全部。 必须有更好的方法,建议?
您可以使用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();
这样,您将在一次往返DB中获得结果。 如果要避免重复,请改用Union
扩展方法。
现在,如果您不想将两个查询都投影到一个通用的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();
在数据库中创建一个在两个表之间执行UNION ALL的视图,然后查询该视图。 不要做工会客户端,你会错过可能的服务器端的优化,你将不能够提供一定的语义般划过两个表中正确的顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.