2011-08-03 28 views
0

"type1"ではないタイプをフィルタリングするコードを以下に示します。linqのwhere句で動的クエリを使用するC#

List = Details.Where(p => p.Type != Constants.Type1).ToList(); 

ここで、私はデータをフィルタリングするために、より多くの句を持つことができるwhereクエリを動的に作成する必要があります。

ので、上記のコードの修正版が

List = Details.Where(p => p.Type != Constants.Type1 && p.Type != Constants.Type2).ToList(); 

であるあなただけ(それが影響しないことを思い出しWhereを複数回呼び出すことができます私はC#でこれを達成することができますどのように

+0

asp.netの関連性がわかりませんか? – gideon

答えて

3
var ExcludedTypes = new Type[] { Constants.Type1, Constants.Type2 }; 
List = Details.Where(p => !ExcludedTypes.Contains(p.Type)).ToList(); 
2

をアドバイスしてください呼び出したクエリ、戻り値のみ)。たとえば、次のように

var query = Details.Where(p => p.Type != Constants.Type1); 
if (avoidType2) 
{ 
    query = query.Where(p => p.Type != Constants.Type2); 
} 
List = query.ToList(); 

編集:私は汎用ダイナミックフィルタリングのために、このアプローチを使用すると思いますので注意してください。あなたが常にタイプごとにフィルターをかけたいと思っていて、それが変化する有効なタイプのリストだけなら、私はGeorgeのアプローチを使用します。

+0

しかし、あなたのコードでは、タイプ1のチェックのために1回、タイプ2のチェックのために2回反復しません。私はワンショットでこれを行うことはできませんか? – Amit

+0

@Amit:いいえ、そうではありません。 * exact *の動作はプロバイダ(LINQ to SQLとLINQ to Objects)によって異なりますが、論理的な結果は各フィルタがクエリから返された各アイテムに順番に適用されることです。 'Where'コールは、LINQの怠惰な性質のため、反復自体を実行しません。 –

+0

だから、あなたが "List = query.ToList();"あなたのコードでは、どこでメソッドを呼んだ場所ではなく実際のフィルタリングが行われますか? – Amit

関連する問題