如何使用Linq为SelectMany聚合两个以上的实体?

时间:2015-02-26 15:45:21

标签: c# linq entity-framework linq-to-sql linq-to-entities

我有一个包含多个表的数据库,我试图将其“压扁”到另一个数据库的一个表中。我只能使用两个表(或实体)轻松地使用Entity Framework执行此操作,但尝试添加3个或更多表会给我编译错误。必须有办法做到这一点,对吧?我觉得我没有正确格式化我的表达。请查看我如何设置以下两个实体:

var flatTable= DB1.MainTable.SelectMany(mt => DB1.SecondaryTable.Where(st => st.MainID == mt.MainID),  (mt, st) => new FlatTable
{
    MainID = mt.MainID,
    AgeLessThan1 = st.AgeLessThan1,
    Age1to4 = st.Age1to4,
    Age5to19 = st.Age5to19,
    Age20to49 = st.Age20to49,
    AgeGreaterThanEqual50 = st.AgeGreaterThanEqual50,
    AgeUnknown = st.AgeUnknown
}).ToList();

上面的代码成功地从第一个数据库上的两个表中获取数据,并创建新的聚合行以插入到另一个数据库的“flat”表中。我的问题是,正在创建的这个实体FlatTable还有更多的字段需要从其他表中填充,我似乎无法在这段代码中添加这些字段。是我可能要求的,还是我必须在多个步骤中添加每个附加表的字段?

下面是将完成的聚合数据添加到第二个数据库上的新表的代码:

foreach (flatRow row in flatTable)
{
    T2.AddToFlatTable(row);
}
T2.SaveChanges();

1 个答案:

答案 0 :(得分:1)

如果没有看到任何其他代码或数据库结构,您应该能够使用连接而不是SelectMany来实现相同的功能。

from mainrow in DB1.MainTable
    join secondrow in DB1.SecondaryTable on mainrow.MainID equals secondrow.MainID
    join thirdrow in DB2.ThirdTable on mainrow.MainID equals thirdrow.MainID
select new FlatTable
{
    MainID = mainrow.MainID,
    AgeLessThan1 = secondrow.AgeLessThan1,
    Age1to4 = secondrow.Age1to4,
    Age5to19 = secondrow.Age5to19,
    Age20to49 = secondrow.Age20to49,
    AgeGreaterThanEqual50 = secondrow.AgeGreaterThanEqual50,
    AgeUnknown = secondrow.AgeUnknown,
    ThirdTableField = thirdrow.Field
    //etc
}