0

在存储库中,我这样做:

public AgenciesDonor FindPrimary(Guid donorId) {
    return db.AgenciesDonorSet.Include("DonorPanels").Include("PriceAdjustments").Include("Donors").First(x => x.Donors.DonorId == donorId && x.IsPrimary);
}

然后在同一个存储库中使用另一种方法,这个:

AgenciesDonor oldPrimary = this.FindPrimary(donorId);

在调试器中,结果视图显示该表中的所有记录,但是:

oldPrimary.Count(); 

是 1(应该是)。

为什么我看到检索到的所有表条目,而不仅仅是 1?我认为行过滤是在数据库中完成的。

如果 db.EntitySet 确实将所有内容都提取到客户端,那么使用 EF 保持客户端数据精简版的正确方法是什么?获取所有行不会根据我正在做的事情进行扩展。

4

2 回答 2

0

实体集不实现 IQueryable,因此您使用的扩展方法是IEnumerable扩展方法。看这里:

http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/121ec4e8-ce40-49e0-b715-75a5bd0063dc/

我同意这是愚蠢的,我很惊讶更多的人没有抱怨它。官方原因:

不使 EntitySet IQueryable 的设计原因是因为没有一种干净的方法来协调 EntitySet 上的 Add\Remove 与 IQueryable 的过滤和转换能力。

于 2011-01-09T21:42:32.387 回答
0

如果将鼠标悬停在 AgenciesDonorSet 上,您将看到所有内容,因为 LINQ to Entities(或 SQL)使用延迟执行。当查询实际执行时,它只是检索计数。

如果要查看为任何查询生成的 SQL,可以添加以下代码:

var query = queryObj as ObjectQuery; //assign your query to queryObj rather than returning it immediately

if (query != null)
{
    System.Diagnostics.Trace.WriteLine(context);
    System.Diagnostics.Trace.WriteLine(query.ToTraceString());
}
于 2009-11-17T21:28:30.680 回答