实体框架查询
问题描述:
我有一段代码,我不知道如何改进它。实体框架查询
我有两个实体:EntityP和EntityC。 EntityP是EntityC的父亲。这是一对多的关系。 EntityP拥有一个属性,取决于其所有附属EntityC的属性。
我需要加载正确设置属性的EntityP列表。所以我写了一段代码来首先获得EntityP列表。它被称为entityP_List。然后,如我在下面写的,我通过entityP_List循环,并为他们每个人,我用一个“任何”函数查询数据库,最终将被转换为“不存在”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;
}
非常感谢!
答
在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(
以上部分。
答
我会将EntityP基于SQL视图而不是表。然后我会定义关系,并在视图中聚合子表的值。
谢谢。它像一个魅力! – Frank 2010-04-30 16:16:26