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

标签 c# oracle entity-framework linq

我有两个结构相同的 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/

相关文章:

c# - Entity Framework 实体完整性

c# - asp.net mvc 发送 httpstatuscode 200 但不返回

oracle - 为什么Oracle 的v$reserved_words View 中有两个 "null"关键字?

C# 将图像转换为文件流

database - 如何向现有表中插入列?

java - 在 ibatis 中是否可以在同一个插入查询中有多个 selectKey 子句?

c# - DbSet<T>.Where(where).ToList() - 为什么 SQL 不包含 where 子句?

asp.net - 更改 MVC 帐户数据库中的 DefaultConnection

c# - 如何在实现 IEnumerable<Foo> 的 Dictionary 包装器类中实现 IEnumerable?

c# - ASP :TextBox and MaxLength