LINQ to PRTIICATE使用(Func(x,bool)不工作

时间:2014-06-27 13:09:23

标签: c# linq-to-entities

我有一个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记录。

任何帮助都会很棒

由于

1 个答案:

答案 0 :(得分:2)

Linq to Entitites使用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();

表达式是lambda的对象表示,它允许库将其转换为SQL以与数据库进行通信。委托人无法做到这一点,因为结构已经编译成IL或机器代码。