c# - Linq 将许多表的结果转换为具有嵌套类的继承类

标签 c# linq nested entity-framework-6

我有一个 SQL 表,但客户删除了所有外键,不让我用所有外键重建表。

我在数据库优先方法上使用了 Entity Framework ,我有类似的东西:

public class MainTable
{
    MainTableID,
    TableChildOneID,
    TableChildTwoID,
    //... many properties
}

public class TableChildOne
{
    TableChildOneID,
    //... many properties
}

public class TableChildTwo
{
    TableChildTwoID,
    //... many properties
}

我创建了一个代表“真实”链接嵌套类的类,例如:

public class MainTable_Extended : MainTable
{
    public TableChildOne ChildOne { get; set; }
    public TableChildTwo ChildTwo { get; set; }
}

请注意,MainTable 包含很多属性

这是我正在寻找简洁语法的查询

IQueryable<MainTable_Extended> listMainTable =
            from main in db.MainTable
            from childone in db.TableChildOne.Where(childone => childone.TableChildOneID == main.TableChildOneID).DefaultIfEmpty()
            from childtwo in db.TableChildTwo.Where(childtwo => childtwo.TableChildTwoID == main.TableChildTwoID).DefaultIfEmpty()
            select new MainTable_Extended
            {
                ChildOne = childone ,
                ChildTwo = childtwo ,
                All others properties coming from => main 
            };

如何填充我的类 MainTable_Extended 而无需为所有属性手动填充。

最佳答案

也许这对你有用?

public class MainTable
   {
       public int MainTableID;
       public int TableChildOneID;
       public int TableChildTwoID;
       //... many properties
   }

public class TableChildOne
   {
       public int TableChildOneID;
       //... many properties
   }

public class TableChildTwo
   {
       public int TableChildTwoID;
       //... many properties
   }

public class MainTable_Extended
   {
       public TableChildOne ChildOne { get; set; }
       public TableChildTwo ChildTwo { get; set; }
       public MainTable Main { get; set; }
   }

public class DB : DbContext
   {
       public DB()
           : base("name=YourName")
       {}

       public virtual DbSet<MainTable> MainTables { get; set; }
       public virtual DbSet<TableChildOne> TableChildOnes { get; set; }
       public virtual DbSet<TableChildTwo> TableChildTwos { get; set; }
   }

public class Test
   {
      public void TestTest()
        {
           var db = new DB();

           IQueryable<MainTable_Extended> listMainTable =
           from main in db.MainTables
           from childone in db.TableChildOnes.Where(childone => childone.TableChildOneID == main.TableChildOneID).DefaultIfEmpty()
           from childtwo in db.TableChildTwos.Where(childtwo => childtwo.TableChildTwoID == main.TableChildTwoID).DefaultIfEmpty()
           select new MainTable_Extended
            {
               ChildOne = childone,
               ChildTwo = childtwo,
               Main = main
            };
        }
    }

我让 MainTable_Extended 类 不继承于 MainTable 类。相反,我使用 MainTable 对象创建了一个属性。所以在查询中我给 MainTable_Extended 一个属性值。

因此,您不能通过调用 MainTable_Extended 的属性 Main 来查询 MainTable 的属性。

关于c# - Linq 将许多表的结果转换为具有嵌套类的继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50580370/

相关文章:

javascript - 如何暂停并调用嵌套 for 循环内的函数?

c# - 对象没有得到垃圾收集

c# - 使用标签单击事件打开和关闭 tabControl

c# - 如何以编程方式将注册表项的所有权授予管理员?

linq - 自定义 LINQ 实现

sql - 具有不同计数和分组依据的嵌套选择

c# - 从两个字符串值之间获取一个字符串

c# - 使用 DataTable 和 List<T> 加入和分组

c# - linq 不会遍历列表

excel - 用于文本(、格式)转换的嵌套字符串