【问题标题】:LINQ TO ENTITIES USING PREDICATE(Func(x,bool) Not WorkingLINQ TO ENTITIES 使用 PREDICATE(Func(x,bool) 不工作
【发布时间】:2014-06-27 21:27:49
【问题描述】:

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

任何帮助都会很棒

谢谢

【问题讨论】:

    标签: c# linq-to-entities


    【解决方案1】:

    Linq to Entitites 使用Expression&lt;Func&lt;?,?&gt;&gt; 作为它的查询方法。 Lambda 表达式会自动强制转换为表达式 (Expression&lt;Func&lt;?,?&gt;&gt;) 或委托 (Func&lt;?,?&gt;),具体取决于它所存储的变量或参数的类型。

    // 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 或机器码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多