2017-06-26 3 views
0

私は次の行を持っている:のLINQ:追加のパラメータ

orderBaseData.Single(o => o.Id == order.Id).OrderMessages.Count; 

を、私はこのビット以上をフィルタリングします。各OrderMessageにはhideFromUserという変数があり、これはFALSEのみに設定されているOrderMessagesの数を取得したいと考えています。事前に

おかげで、

ボブ

+2

'orderBaseData.Single(o => o.Id == order.Id).OrderMessages.Count(om =>!om.hideFromUser);' – haim770

+0

このクエリがデータベースに対して実行されている場合(Entity Frameworkなどを使用している場合) ORMツールなど) - あなたはorderBaseData.Where(o => o.Id == order.Id).SelectMany(o => o.OrderMessages).Where(m =>!m.hideFromUser)のようなものを使用することをお勧めします。 Count() 'を実行してデータベースに対して1つのクエリを実行します。 – Evk

+0

@Evkこれは実際には 'Single'制約を強制しません。 – grek40

答えて

1

使用OrderMessages

orderBaseData 
    .Single(o => o.Id == order.Id) 
    .OrderMessages 
    .Where(x => !x.hideFromUser) 
    .Count(); 
+0

完璧に動作します、ありがとう! –

+1

これをカウントステートメントに書き込むことで少し圧縮することができます: 'orderBaseData.Single(o => o.Id == order.Id).OrderMessages.Count(x =>!x.hideFromUser);' – brijber

0

上の単一のクエリで効率的にデータを取得するのではなく、その後OrderMessagesを遅延読み込みに頼っするためには、あなた次のものを使用できます:

orderBaseData 
    .Where(o => o.Id == order.Id) 
    .Select(o => o.OrderMessages.Where(x => !x.hideFromUser).Count()) 
    .Single(); 

このap orderBaseDataがデータベースを対象とするIQueryableの場合、プローチは大部分興味深いです。すべてのデータが既にメモリに格納されている場合は、他の方法よりも実際には良くないか悪いわけではありません。

+0

It IDフィールドのフィルタリングが複数のオブジェクトではなく単一のオブジェクトを返すという理由があります。これはOPの '.Single()'の使用によって暗黙的に確認されます。なぜあなたが質問の '.Single()'を '.Where()'に変更したのか分かりませんが、これについての正当な理由は見当たりません。これは、あなたの答えの残りの部分を、それに目に見える恩恵なしに、不必要に複雑にしています。 – Flater

+0

@Flater私は 'Select'の前にフィルタをかけます。そうしないと、選択したプロパティに' Id'を保持する必要があるからです。このようにして、カウントを値として選択することができます。これは、 'Single'のフィルターとしては本当に適切ではありません。 – grek40

+0

あなたのフィルタリングが1つの結果しか得られないと確信しているときに '.Where()'を使う点は何ですか?あなたは、その結果をIEnumerableで不必要にラップしています。私の主張は**あなたは 'Select()'ステートメントがまったく必要ないということです**。あなたの答えは不必要に考案されました。カウンターの提案: 'orderBaseData.Single(o => o.Id == order.Id).OrderMessages.Where(x =>!x.hideFromUser).Count()'私は不要なIEnumerableラップとその結果を単に削除しました。 – Flater

関連する問題