簡體   English   中英

條件Linq

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM