实体框架(5)LINQ方法返回整个实体集合然后应用过滤器

时间:2013-02-12 22:29:26

标签: entity-framework

我有这样的代码:

        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&lt;&gt;返回SQL查询,但返回整个.Users设置后的内存集合。

有趣的是,以下内容使用正确的where子句过滤UserID生成查询:

        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不会在生成的SQL中构建谓词var?
  2. 是否有另一种方法可以重复使用谓词,以便我的代码可以保持干净和可读,并且还将EF填充到生成的SQL中?

1 个答案:

答案 0 :(得分:4)

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

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