如何使用 Linq 为 SelectMany 聚合两个以上的实体?
How to aggregate more than two entities using Linq for a SelectMany?
我有一个包含多个 table 的数据库,我正试图将它们 "flatten" 转换为另一个数据库中的一个 table。我可以使用 Entity Framework 仅使用两个 table(或实体)轻松地做到这一点,但尝试添加 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();
以上代码成功地从第一个数据库的两个 table 中获取数据,并创建新的聚合行以插入到另一个数据库的 "flat" table 中。我的问题是正在创建的这个实体 FlatTable
有更多的字段需要从其他 table 填充,我似乎无法在这段代码中添加这些字段。我问的是可能的,还是我必须在多个步骤中添加每个额外 table 的字段?
下面是将完成的聚合数据添加到第二个数据库上的新table的代码:
foreach (flatRow row in flatTable)
{
T2.AddToFlatTable(row);
}
T2.SaveChanges();
无需查看任何其他代码或您的数据库结构,您应该能够使用联接而不是 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
}
我有一个包含多个 table 的数据库,我正试图将它们 "flatten" 转换为另一个数据库中的一个 table。我可以使用 Entity Framework 仅使用两个 table(或实体)轻松地做到这一点,但尝试添加 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();
以上代码成功地从第一个数据库的两个 table 中获取数据,并创建新的聚合行以插入到另一个数据库的 "flat" table 中。我的问题是正在创建的这个实体 FlatTable
有更多的字段需要从其他 table 填充,我似乎无法在这段代码中添加这些字段。我问的是可能的,还是我必须在多个步骤中添加每个额外 table 的字段?
下面是将完成的聚合数据添加到第二个数据库上的新table的代码:
foreach (flatRow row in flatTable)
{
T2.AddToFlatTable(row);
}
T2.SaveChanges();
无需查看任何其他代码或您的数据库结构,您应该能够使用联接而不是 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
}