Linqに、「... where(a = 1)OR(a = 2)」のようなSQL文字列を作成するために使用できるメソッドはありますか?
6 に答える
あなたは確かに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 );
単一のwhere句で標準の.NETブール演算子を使用できます。
MyDataSource.Where(data => data.a == 'a' || data.a == 'b')
通常のC#===>||とまったく同じ演算子を使用します 「または」の場合&&「および」の場合など
var something = from s in mycollection
where s.something == 32 ||
s.somethingelse == 45
select s
.Where()
呼び出しでは、標準のブール値の「または」演算子を使用します||
。
var query = items.Where(item => (item == 1 || item == 2));
Where呼び出しが行うのは、必要なものすべてのブール比較であるため、必要な数の条件付きロジックで埋めることができます。
パラメータ数がわからない場合は、次を使用できます。
サンプルデータ
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();
これは現在.netに組み込まれていますが、以前は組み込まれていなかったかどうかはわかりません。既存のLinqクエリを指定すると、文字列の配列(SearchStrings)を受け取るwhere句を追加し、それらのいずれかが検索対象のコレクション内のオブジェクトと一致するかどうかを確認できます。ToLower()を使用すると、SQLクエリで大文字と小文字を区別しないようにすることができます。
query.Where(i => SearchStrings.Any(s => i.ToLower().Contains(s.ToLower()));
配列内のすべての単語をコレクションのオブジェクトに一致させることにより、'および'述語に対して同じことを行うことができます。
query.Where(i => SearchStrings.All(s => i.ToLower().Contains(s.ToLower()));
この例では、iはコレクション内の各オブジェクトに相関し、sはSearchStrings配列内の各文字列に相関します。