2016-03-23 14 views
1

私は、LINQを使用して、さまざまな量のOR句を含むSQLクエリを作成する必要があるシナリオを持っています。私はいくつかの入力に基づいてクエリを構築する関数を書いています。関数定義は、私が真かどうかを確認する必要がある列のコレクションを与えてる、だから... ...LINQを使用してOR句を連結する方法は?

function BuildQuery(ICollection<ColumnsThatNeedToBeTrue> columns) 
{ 
    ... 
} 

をに似た何かを見て、チェックがOR句を使用する必要があります。

columns配列がABが含まれている場合、私は列Aが真または列Bが真であるかどうかをチェックするクエリを必要があると思います。

columns配列はABCが含まれている場合、私はA OR B OR Cに該当する場合に照会して確認する必要があると思います。

||句を徐々に追加する方法がわからないため、これをすべて1つのWhereで行う方法はわかりません。入力配列に基づいて、以下に追加のORチェックをどのように含めるかはわかりません。それはAND句を使用して、そのクエリを構築しているため

var query = entities.Where(m => m.A == true || m.B == true ...) 

私はチェーンWhere機能は、自分のカラムのチェックのために、それぞれが、私はORを必要とすることはできません。

LINQを使用して、このようなクエリを作成する方法はありますか?

+0

'In'句? http://stackoverflow.com/questions/959752/where-in-clause-in-linq –

+0

「UNION」が役立つかもしれませんか? –

+0

SQLではこれらのものがすべて個別の列であるため、動作しないと思います。私のEFエンティティクラスでは、これらの列は各列の 'bool'プロパティとして表されます。私の関数への入力として、どの列が真であるかを示す 'enum'の配列が与えられています。比較するための実際の配列はありません - 個々のboolカラム/プロパティだけです。 – Ryan

答えて

3

PredicateBuilderを使用して、orの条件を使用できます。

+0

これはC#5+のみですか?残念ながら私はまだ4.5歳です。 – Ryan

+0

@ Ryanいいえ、自分でPredicateBuilderクラスを追加するだけではありません。 「PredicateBuilderソースコード」の下にリンクされているページにあります。 – Magnus

+0

@Magnus問題は、LinqKitがEFをターゲットにしているようだからです。 –

-1

Linqは異なる実行を使用するため、クエリは互いに構築され、データにアクセスするまで実行されません。

ここでは、必要に応じて2つの特定のwhere句を作成するための外部条件のキーとなる単純な例でクエリを作成する方法を示します。

var myData = TheData.Where(itm => itm.Value == true); 

if ({some condition}) 
    myData = myData.Where(itm => itm.Other == true); 
else 
    myData = myData.Where(itm => itm.SomethingElse == false); 

var result = myData.ToList(); 

最終結果はifからwhereのいずれかの句を持つことになりますし、実行時に動的に実行されます。

+1

ここで問題は 'Where'が' AND'です。私はこの同じ手法を使って 'OR'を連鎖させたいと思っています。 – Ryan

関連する問題