Linq Where()ラムダ式の「Or」に相当


91

Linqに「... where(a = 1)OR(a = 2)」のようなSQL文字列を作成するために使用できるメソッドはありますか?


4
私はあなたがのよう||なダイナミックな何かを使用する方法を知りたいと思うと思いますa=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);。あなたはそれをもっと明確に述べたいかもしれません...
Kobi

回答:


189

Where句(拡張メソッド)内で確実に実行できます。ただし、複雑なクエリを動的に作成する必要がある場合は、PredicateBuilderを使用できます。

 var query = collection.Where( c => c.A == 1 || c.B == 2 );

またはPredicateBuilderを使用する

 var predicate = PredicateBuilder.False<Foo>();
 predicate = predicate.Or( f => f.A == 1 );
 if (allowB)
 {
    predicate = predicate.Or( f => f.B == 1 );
 }

 var query = collection.Where( predicate );

着信パラメーターの値に応じてOrを作成する必要があるので、これはうまく機能しました-すごい!
マーク・

とてもかっこいい。残念なことに、これは.NET内の関数として標準で含まれていません。
maxp 2013

1
非常に優れた実装ですが、これはC#5以降でのみ機能することは指摘されていませんでした。
Thomas.Donnelly、2015


19

通常のC#と同じ演算子をすべて使用します===> || 「または」および&および「および」など

var something = from s in mycollection
                where s.something == 32 || 
                      s.somethingelse == 45 
                select s

1

.Where()呼び出しでは、標準のブール「Or」演算子を使用します||

var query = items.Where(item => (item == 1 || item == 2));

Where呼び出しはすべて、必要なものに対するブール比較なので、必要なだけ条件付きロジックで満たすことができます。


0

パラメータ数がわからない場合は、これを使用できます。

サンプルデータ

var parameters= new List<string>{"a","d"};
var sampledata = new Dictionary<string,string>();
    sampledata["a"] = "A";
    sampledata["b"] = "B";
    sampledata["c"] = "C";
    sampledata["d"] = "D";

コード

var query = sampledata.AsQueryable();
var firstItemKey = sampledata.FirstOrDefault().Key;
var queryresult= sampledata.Where(x => x.Key == firstItemKey).AsQueryable();
foreach (var parameter in parameters.Skip(1))
{
    queryresult=queryresult.Concat(query.Where(x => x.Key == parameter));
}
var result = queryresult.ToList();

-1

これは現在.netに組み込まれていますが、以前はそうでなかったかどうかはわかりません。既存のLinqクエリを指定すると、文字列の配列(SearchStrings)を受け取るwhere句を追加し、それらが検索対象のコレクション内のオブジェクトと一致するかどうかを確認できます。ToLower()を使用すると、SQLクエリで大文字と小文字が区別されないようになります。

query.Where(i => SearchStrings.Any(s => i.ToLower().Contains(s.ToLower()));

配列内のすべての単語をコレクションのオブジェクトと照合することにより、「and」述語に対して同じことを行うことができます。

query.Where(i => SearchStrings.All(s => i.ToLower().Contains(s.ToLower()));

この例では、コレクション内の各オブジェクトに相関し、sはSearchStrings配列内の各文字列に相関しています。


1
'Any'はEFプロバイダーによって変換できず、ローカルで評価されるため、フルテーブルスキャンとメモリ内フィルタリングが行われることに注意してください。
Wade Bee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.