[英]Conditional Linq
我有兩個條件,它們既可以設置,也可以只是其中之一。 如果都設置為一個值,聲明應擁有和布爾運算符否則LINQ where語句應只包括根據設定的條件過濾器,可觸發LINQ。
例如:
設置兩個條件:linq.Where(condition1 && condition2)...
只設置condition1:linq.Where(condition1)..
只設置condition2:linq.Where(condition2)..
這是不允許的:linq.Where(condition1 || condition2),因為過濾必須非常准確
現在我的問題是如何編寫一個考慮所有這些要求的linq語句? 提前致謝
編輯:
謂詞可能看起來像這樣:x => x> 10或x => x ==“ Hello”或x => x + 2 == 3 ..任何適合where語句的表達式。
我得到條件/謂詞,我自己沒有創建它們
謂詞是指數學中的謂詞,而不是c#中的類。
沒有太多代碼可發布,因為我不知道如何在一個linq語句中執行此操作
結果必須是處理所有這些的一個linq語句。
我是新的,我不知道如何寫這就是為什么我希望你能幫助我。
如果你不喜歡它不downvote它只是傳遞,有人會幫助我。
編輯2:
我是說這個 不多不少:
method<T> filterList(ienumerable<T> linq, Predicate<T> p1, Predicate<T> p2)
{
return linq.Where(only p1 or only p2 or p1 && p2)
}
這是monad的優點-您不必一步一步地完成所有操作。
// bool? flag1
// bool? flag2
// IQueryable<something> collection
if(flag1.HasValue)
collection = collection.Where(x => x.Flag1 == flag1);
if(flag2.HasValue)
collection = collection.Where(x => x.Flag2 == flag2);
//...
編輯:如果要在單個LINQ語句中執行此操作,則需要通過調用謂詞來做一些技巧:
public IEnumerable<T> FilterList<T>(IEnumerable<T> collection, Predicate<T> p1, Predicate<T> p2)
{
return collection.Where(x =>
(p1 == null || p1.Invoke(x)) &&
(p2 == null || p2.Invoke(x))
);
}
您沒有說如果兩個都未設置怎么辦,我假設在這種情況下根本沒有過濾,我假設 “沒有值”意味着p1為空。 我不確定100個linq語句的意思,但是我認為至少有以下一種可以滿足您的需求。
在所有情況下,我所說的都是[將空謂詞替換為始終為真的謂詞,並且謂詞]
解決方案1
return linq.Where(x => p1 != null ? p1(x) : true).Where(x => p2 != null ? p2(x) : true);
解決方案2
var p1a = p1 ?? (x => true);
var p2a = p2 ?? (x => true);
return linq.Where(x => p1a(x) && p2a(x));
解決方案3
return linq.Where(x => (p1 ?? (y=>true))(x) && (p2 ?? (z=>true))(x));
如果使用第三方PredicateBuilder ,則可以迭代構建or
過濾以及and
。
var predicate = PredicateBuilder.False<Product>();
foreach (string keyword in keywords)
{
string temp = keyword;
predicate = predicate.Or (p => p.Description.Contains (temp));
}
return dataContext.Products.Where (predicate);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.