我有这样的代码:
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;
答案 0 :(得分:4)
EF无法解释已编译的IL代码(您的Func本质上是这样)。它需要像Reflector那样猜测原始代码。对于框架而言,这不是一个有吸引力的设计选择,因此它不会那样工作。当你内联lambda它不是一个Func。它是 可分析的表达式。搜索“C#表达式树”以了解更多信息。
是:对您的变量使用Expression<Func<User, bool>>
。