使用谓词(函数(x,bool))的LINQ到实体不工作

本文关键字:LINQ 实体 工作 bool 谓词 函数 | 更新日期: 2023-09-27 18:10:43

我有一个Where子句谓词,它正在抓取记录。现在,如果我在Where子句中使用相同的谓词(即Func(x,bool)),它不会返回任何记录。我的印象是两者是相等的。-见下文

var nonPredicate=this.ObjectSet.Where(x=>!String.IsNullOrEmpty(x.Email) && x.Email.Contains("AND")).ToList();
Func<Model,bool) clause=x=> x=>!String.IsNullOrEmpty(x.Email) && x.Email.Contains("AND");
var predicateRes=this.ObjectSet.Where(clause).ToList();

我期望在两种情况下得到相同的结果,但是第一个产生29条记录结果,第二个产生0条记录。

任何帮助都将是伟大的

谢谢

使用谓词(函数(x,bool))的LINQ到实体不工作

Linq to entities使用Expression<Func<?,?>>作为查询方法。Lambda表达式自动转换为表达式(Expression<Func<?,?>>)或委托(Func<?,?>),具体取决于存储它的变量或参数的类型。

// Inline expression
var nonPredicate = this.ObjectSet.Where(x =>
    !string.IsNullOrEmpty(x.Email) && x.Email.Contains("AND")).ToList();
// Delegate type
Func<Model,bool> clauseDelegate = x =>
    !string.IsNullOrEmpty(x.Email) && x.Email.Contains("AND");
// Expression type
Expression<Func<Model,bool>> clauseExpr = x =>
    !string.IsNullOrEmpty(x.Email) && x.Email.Contains("AND");
var predicateRes = this.ObjectSet.Where(clauseExpr).ToList();

Expressions是lambda的对象表示形式,它允许库将其转换为SQL以便与数据库通信。对于委托,这是不可能的,因为结构已经编译成IL或机器码。