0

単純なエンティティフレームワーククエリがあります。グループ化を使用します。

source.GroupBy(x => x.Key)
.Select(x => x.Count(z => z.IsDefaultValue == false) > 0
    ? x.FirstOrDefault(z => z.IsDefaultValue == false)
    : x.FirstOrDefault()
);

その実行計画は次のようになります。

プラン1

次に、クエリを変更します。

source.GroupBy(x => x.Key)
.Select(x => x.Any(z => z.IsDefaultValue == false)
    ? x.FirstOrDefault(z => z.IsDefaultValue == false)
    : x.FirstOrDefault()
);

今はCountの代わりにAnyを使用しています。計画は次のようになります。 プラン2

私の質問は、どのクエリを使用すればよいですか?どのクエリがより効率的ですか?

実行計画については何もわかりません:(これらの実行計画について、どのような重要な情報がありますか?

編集:新しいタブに画像をドラッグしてください。読みやすくなります。

4

1 に答える 1

1

私の質問は次のとおりです。どのクエリを使用すればよいですか? どのクエリがより効率的ですか?

その答えを見つけるには、生成された両方の SQL クエリを取得し (完全なクエリはプランの xml で確認できます)、1 つの SQL Server Management Studio クエリ ウィンドウでそれらを一緒に実行します。実行計画」オプションをオンにします。

結果のプランの「クエリ コスト (バッチに関連)」は、実際のスキーマ/データでどちらがより効率的であるかを示します。

EF の Any() と Count() > 0 はどうですか? どちらがより効率的ですか?

一般に、条件に一致する「もの」があるかどうかだけを知りたい場合、Count() > 0 の代わりに Any() を使用し、LINQ に最も効率的な方法の構築を心配させることをお勧めします。この使用例では、SQL をチェックして確認します。

このような回答を参照してください

justIEnumerable<T>の場合、1 回の反復のみを確認するだけでよいため、通常Any()は高速になります。

于 2012-08-01T13:05:31.583 に答える