【问题标题】:MVC 1.0 + EF: Does db.EntitySet.where(something) still return all rows in table?MVC 1.0 + EF:db.EntitySet.where(something) 是否仍返回表中的所有行?
【发布时间】:2010-12-17 15:17:12
【问题描述】:

在存储库中,我这样做:

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 保持客户端数据精简版的正确方法是什么?获取所有行并不能适应我正在做的事情。

【问题讨论】:

    标签: entity-framework entityset


    【解决方案1】:

    如果您将鼠标悬停在 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());
    }
    

    【讨论】:

    • 但是当只有 1 行与 lba 谓词匹配时,为什么查询会返回表中的所有行?这就是困扰我的地方。这几乎就像 EntitySet 将整个表的副本快照到 EF 中,然后 EF 以某种方式在数据库之外进行过滤。这不符合我的需要,因为我有数十万行。
    • 您导致在调试器中枚举语句,这并不能反映代码中实际发生的情况。当代码执行时,只会从数据库中检索一行。
    【解决方案2】:

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

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

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

    不制作的设计原因 EntitySet IQueryable 是因为 没有一种干净的调和方法 在 EntitySet 上添加\删除 IQueryable 的过滤和 转化能力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 2012-01-31
      • 2019-09-28
      相关资源
      最近更新 更多