我有一个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记录。
任何帮助都会很棒
由于
答案 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或机器代码。