2

我有这样的代码:

        User rValue = null;
        var userByID = new Func<User, bool>(x => x.UserId.Equals(userID, StringComparison.InvariantCultureIgnoreCase));

        if (this._context.Users.Any(userByID))
        {
            var user = this._context.Users
                .Include("nested.Associations")
                .Single(userByID);

            rValue = user;
        }

        return rValue;

我开始分析查询,并注意到 EF 没有将 Func<> 应用于 SQL 查询,而是在返回整个 .Users 集后应用于内存中的集合。

有趣的是,下面会生成带有过滤 UserID 的正确 where 子句的查询:

        User rValue = null;
        //var userByID = new Func<User, bool>(x => x.UserId.Equals(userID, StringComparison.InvariantCultureIgnoreCase));

        if (this._context.Users.Any(x => x.UserId.Equals(userID, StringComparison.InvariantCultureIgnoreCase)))
        {
            var user = this._context.Users
                .Include("nested.Associations")
                .Single(x => x.UserId.Equals(userID, StringComparison.InvariantCultureIgnoreCase));

            rValue = user;
        }

        return rValue;
  1. 为什么 EF 不会将谓词 var 构建到生成的 SQL 中?
  2. 是否有另一种方法可以重用谓词,以便我的代码可以保持干净和可读,并将 EF 填充到生成的 SQL 中?
4

1 回答 1

4
  1. EF 无法解释编译后的 IL 代码(您的 Func 本质上就是这样)。它需要像 Reflector 那样猜测原始代码。对于框架来说,这不是一个有吸引力的设计选择,所以它不能那样工作。当您内联 lambda 时,它不是 Func。这是一个分析的表达式。搜索“C# 表达式树”以了解更多信息。

  2. 是:Expression<Func<User, bool>>用于您的变量。

于 2013-02-12T23:37:37.533 回答