我有一段代码,我不知道如何改进它。
我有两个实体:EntityP和EntityC。 EntityP是EntityC的父级。这是1对多的关系。 EntityP具有一个属性,具体取决于其所有附加的EntityC的属性。
我需要加载一个EntityP列表,并正确设置属性。所以我写了一段代码来获取EntityP List。它叫做entityP_List。然后,正如我在下面写的那样,我循环遍历entityP_List,对于每一个,我用“any”函数查询数据库,最终将其转换为“NOT EXIST”sql查询。我使用它的原因是我不想将所有附加的entityC从数据库加载到内存,因为我只需要其属性的聚合值。但问题是,对于每个EntityP,循环将多次查询数据库!
所以我想知道是否有人可以帮助我改进代码以仅查询数据库一次以获得所有EntityP.IsAll_C_Complete设置,而无需将EntityC加载到内存。
foreach(EntityP p in entityP_List)
{
isAnyNotComoplete = entities.entityC.Any(c => c.IsComplete==false && c.parent.ID == p.ID);
p.IsAll_C_Complete = !isAnyNotComoplete;
}
非常感谢!
答案 0 :(得分:1)
在EF 4中,你可以这样做:
var ids = entityP_List.Select(p => p.ID);
var q = (from p in entities.entityP
where ids.Contains(p => p.ID)
select new
{
ID = p.ID,
IsAll_C_Complete = !p.entityCs.Any(c => !c.IsComplete)
}).ToList();
foreach (var p in entityP_List)
{
p.IsAll_C_Complete = q.Where(e.ID == p.Id).Single().IsAll_C_Complete;
}
...将在一个数据库查询中执行整个操作。对于EF 1,Google BuildContainsExpression
替换上述.Contains(
部分。
答案 1 :(得分:0)
我将EntityP基于SQL视图而不是表。然后我将定义关系,并在视图中聚合子表的值。