繁体   English   中英

Entity Framework 6 + Oracle如何查询结构相同的两个表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM