【问题标题】:Entity Framework not respecting lazy evaluation实体框架不尊重惰性评估
【发布时间】:2012-05-17 12:39:05
【问题描述】:

这行得通:

var user = db.Users.OrderByDescending(u => u.Id).FirstOrDefault(u => u.Email == "asd@gmail.com" && u.Password == "8a79hjhfas8d7fd89");

正确生成只返回一个用户的sql语句。

下面的代码在理论上是相同的,它从数据库中获取所有用户,然后只应用过滤器。它就像我在执行 .ToList() 一样工作,因此评估数据库中的所有内容,并在常规 IEnumerable 中应用过滤器,而不是生成正确的 sql 语句:

public static User Get(Func<User, bool> predicate)
{
  return db.Users.OrderByDescending(u => u.Id).FirstOrDefault(predicate);
}

var user = User.Get(u => u.Email == "asd@gmail.com" && u.Password == "8a79hjhfas8d7fd89");

这是实体框架的错误还是我遗漏了什么?

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    您正在传递一个Func&lt;&gt;,它是一个已编译的委托。相反,您应该传入 Expression&lt;&gt; 作为 Get 参数,这是一个语法树,EF 可以分析并生成查询,而不是针对每个结果执行委托方法。

    【讨论】:

      【解决方案2】:

      EF 不知道如何将任意 Func 委托转换为 SQL,因此它别无选择,只能加载整个数据集,然后在该结果集上运行谓词。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 2014-01-08
        • 2011-06-27
        • 2013-03-11
        • 2017-01-18
        • 2018-11-11
        相关资源
        最近更新 更多