2011-01-21 182 views
2

您好我正在使用動態LINQ,使用LinqKit的PredicateBuilder。動態LINQ查詢

如果你看看代碼,在TODO註釋後面,我想完成類似 假設objectList中有2個對象。 object1,Object2的 (object1.property1和object1.property2)OR(object2.property1和object2.property2)

我知道行後TODO是不正確的,但我期待該行的正確版本。

 

    var finalPredicate = PredicateBuilder.True(); 

    foreach (var item in objectList) 
    { 
    var predicate = PredicateBuilder.True(); 
    predicate = predicate.And (p => p.Description.Contains (item.property1)); 
    predicate = predicate.And (p => p.Description.Contains (item.property2)); 
    //TODO: 
    finalPredicate = finalPredicate.Or(predicate); 
    } 
} 
+0

這是最後謂詞: ' finalPredicate {F =>(真OrElse運算調用(F =>(((真AndAlso調用(P => p.ef.Contains(值(服務1 + <> (p => p.fname.Contains(value(Service1 + <> c__DisplayClass2).item.ff),f))AndAlso Invoke(p => p.subject。包含(值(Service1 + <> c__DisplayClass2).item.fs),f)),f))} System.Linq.Expressions.Expression >` – WhoIsNinja 2011-01-21 22:22:47

+0

這是錯誤消息:參數'f'沒有綁定在指定的LINQ to Entities查詢表達式中。 – WhoIsNinja 2011-01-21 22:23:55

回答

1

所以我發現從其他計算器的問題有一天,我很抱歉,我沒有鏈接,現在該職位的解決方案,但是這是解決方案

當使用謂詞中斷言,你必須每次展開()。查看TODO的下一行修補程序。這解決了我的問題。

也修正了真正的錯誤問題,但這是邏輯錯誤。

 
var finalPredicate = PredicateBuilder.False(); 

    foreach (var item in objectList) 
    { 
    var predicate = PredicateBuilder.True(); 
    predicate = predicate.And (p => p.Description.Contains (item.property1)); 
    predicate = predicate.And (p => p.Description.Contains (item.property2)); 
    //TODO: 
    finalPredicate = finalPredicate.Or(predicate.Expand()); 
    } 
} 
3
var finalPredicate = PredicateBuilder.True(); 

應該是

var finalPredicate = PredicateBuilder.False(); 

真或x =總是真實的(x被忽略)。

False or x = x。


另一個問題是在lambda表達式中捕獲循環變量的方式。

foreach (var item in objectList) 
{ 
    var loopItem = item; 
    //now use loopItem instead of item. 
    ... 
} 
+0

@David,謝謝。但是我得到這個錯誤:參數'f'未綁定在指定的LINQ to Entities查詢表達式中。 – WhoIsNinja 2011-01-21 20:47:15

2

不應該finalPredicate作爲False開始嗎?這將始終評估爲真。


編輯:

說完看着您發佈的異常代碼,我想你可以把它非常大致爲:

(僞)

finalPredicate = 
    true || 
    (true && 
     p.ef.Contains(item.FilterDomain) && 
     p.fname.Contains(item.ff) && 
     p.subject.Contains(item.fs) 
    ) 

請注意,這不是它真的手段;你正在構建一個表達式樹,它不同於經典的命令式C#(所以這個編輯可能是爲了downvotes)。但它可能會讓你更容易想到這一點。

所以你在這裏至少有兩個問題:

  • 我和其他人指出是第一個true || ...。真正的價值||任何事物總會產生真實的。所以如果你初始化finalPredicate爲True,那麼無論如何,整個事情都會是真的。實際上,your other expressions might not even get evaluated,這就是爲什麼當你初始化finalPredicate爲False時你纔會看到這個異常。這是唯一一次你的代碼被擊中。
  • 您可能在for循環的某處出現了錯誤,我的猜測是它與Contains的調用有關。但是,如果不瞭解您的情況或所涉及的數據,就很難說清楚這一點。

希望這會有所幫助。