2016-03-01 11 views
5

これを書くには良い方法があると思いますが、私は精神的ブロックを経験しています。OR演算子を使用したラムダ式

int num = 0; 

using(var db = new TestDB()) 
{ 
    num = db.Table.Where(x => x.FavoriteSport == "Baseball" && 
          (x.FavoriteColor == "Green" || 
           x.FavoriteColor == "Blue" || 
           x.FavoriteColor == "Red")).Count(); 
} 

return num; 

OR文を書くための良い方法はありますか?私が試してみました:

x.FavoriteColor == "Green" || "Blue" || "Red" 

が、コンパイラがすべてのヘルプは高く評価されOperator || cannot be applied to operands of type 'bool' and 'string'

言います。

+1

Go]を入れ替えることができますことは注目に

num = db.Table.Count(x => x.FavoriteSport == "Baseball" && new []{"Green","Red","Blue"}.Contains(x.FavoriteColor); 

価値。私は、あなたの現在の例が読みやすく保守的であると信じています。それは何も問題ありません。 'using'と' return'ステートメントの間に何もない場合は、 'return db.Table.Where ... 'を実行してください。 – Default

+0

素早いコメントと回答ありがとうございました。私はそれらの答えのすべてが非常に急速に起こることを期待していませんでしたが、私はSOが#1だと思います。 @Defaultノートに感謝します。私はそれを必ず使用します。もう一度ありがとう –

+0

@賢い良い点、私はそれを逃した。混乱を避けるためにコメントを削除しました –

答えて

6

Containsの配列/リスト/ハッシュセットのメソッドを使用できます。

var colors = new List<string> {"Green", "Red", "Blue" }; 

db.Table.Where(x => x.FavoriteSport == "Baseball" && 
         (colors.Contains (x.FavoriteColor)).Count() 

それは私があなたがメモリに保存されたデータセットで作業する場合、あなたがリストのContainsはO(Nを取ることに留意すべきであることを追加したい

SELECT ... WHERE FavoriteColor = 'Baseball' AND FavoriteColor in ("Green", "Red", "Blue") 

のようなSQLクエリを生成します。 )反復を行って結果を得る。したがって、colorsに多くの要素が含まれている場合は、O(1)の代わりにHashSetを使用する必要があります。

var colors = new HashSet<string> {"Green", "Red", "Blue", .... }; 

someDataSet.Where(x => x.FavoriteSport == "Baseball" && 
         (colors.Contains (x.FavoriteColor)).Count() 

あなたは、あなたがオブジェクトのコンテナを使用し、Containsメソッドを使用することができますhere

+0

最初のIMOの例を常に表示してください。あなたは答えの最後まで編集する必要はありません。 – Default

+2

好奇心のため、ハッシュセットのパフォーマンスが向上しますか?これはデータベースへのクエリで、動的SQLに変換されるので、コレクション全体を繰り返し処理する必要があります。 –

+1

@Valentin [OK]を私はメモリで、ハッシュセットを介してより効率的な(時には)検索に同意します。私が作っているのは、このコマンドがSQLを生成する必要があるということです(つまり、OPはEFを使用しています)。生成されたクエリは "SELECT ... where FavoriteSport =" Baseball "AND FavoriteColor IN( 赤色、"青色 "、"緑色 ")である必要があります。 IN文を生成するには、コレクション全体を反復処理する必要があります。 –

4
string[] FavColor = new string[]{"Green","Red","Blue"}; 

int num = 0; 

    using(var db = new TestDB()) 
    { 
     num = db.Table.Where(x => x.FavoriteSport == "Baseball" &&FavColor.Any(x.FavoriteSport)).Count(); 
    } 

    return num; 
3

一覧-HashSetの性能比較を見つけることができます。例:

var favoriteColors = new List<string> 
{ 
    "Blue", "Green", "Red" 
}; 
var num = 0; 

using(var db = new TestDB()) 
{ 
    num = db.Table.Where(x => x.FavoriteSport == "Baseball" && favoriteColors.Contains(x.FavoriteColor)).Count(); 
} 

私は、生成されたSQLがteh IN文を使用していることを確認するプロファイルをチェックします。

3

誰もが言いましたか?有効な文字列のコレクションを作成し、その文字列がそのコレクションに含まれているかどうかを確認できます。あなたは、インラインそれを行うことができます:あなたが読みやすくするために、あなたのWhereCount用から直接

関連する問題