1

LINQクエリがあります:

int criteria = GetCriteria();
var teams = Team.GetTeams()
    .Where(team=> criteria == 0 || team.Criteria == criteria)
    .ToList();

それを次のように変換することは、パフォーマンス(または他の観点)から意味がありますか?

var teams = Team.GetTeams();
if (criteria != 0)
{
    teams = teams.Where(team => team.Criteria == criteria);
}
teams = teams.ToList();

私には確かな基準があります。それらを分離し、必要な場合にのみ各基準を適用する必要がありますか?または、それらを1つのLINQクエリに適用し、クエリを最適化するために.NETに任せますか?

お知らせ下さい。どんな考えでも大歓迎です!

PS Guys、私はLinq2Sqlを使用せず、LINQだけを使用します。これは純粋なC#コードです。

4

2 に答える 2

5

まず、LINQには実際にはいくつかの種類があることを理解することが重要です。これらの種類は、ほとんどの場合、式ツリーを使用するかコンパイル済みコードを使用してクエリを実行するかによって分類できます。

Linq2Sql(およびクエリを別の形式に変換してクエリを実行するLinqプロバイダー)は、式ツリーを使用して、クエリを分析し、別の形式(多くの場合SQL)に変換できるようにします。この場合、プロバイダーがクエリを変更して、ある程度の最適化を実行する可能性があります。私は現在これを行っているプロバイダーを知りません。

Linq to Objectsはコンパイルされたコードを使用し、常に記述されたとおりにクエリを実行します。開発者以外にクエリを最適化する機会はありません。

次に、すべてのLinqクエリが延期されます。つまり、結果を取得しようとするまで、クエリは実際には実行されません。これの副作用は、いくつかのステップでクエリを作成でき、最後のクエリのみが実行されることです。質問の2番目の例でも、実行されるクエリは1つだけです。

Linq2Sqlを使用している場合は、両方のクエリのパフォーマンスがほぼ同じである可能性があります。ただし、多くの基準を処理するために拡張された最初の例は、パフォーマンスを最終的に低下させる、不十分で過度に一般的な実行計画につながる可能性があります。トリミングされたクエリはこのリスクを実行せず、基準の実際の順列ごとに実行プランを生成します。

Linq to Objectsを使用している場合、最初のクエリは、条件が常にtrueを返す場合でも、入力ごとにWhereに渡された述語を1回実行するため、2番目のクエリが間違いなく望ましいです。

于 2012-04-23T05:30:39.977 に答える
3

基準値を1回だけチェックするので、2番目のオプションの方が良いと思います。一方、最初のクエリでは、すべての行に対して基準がチェックされています。
ただし、パフォーマンスが大幅に向上することはないと思います。これにより、レコード数が多いテーブルでより良い結果が得られる可能性があります(理論的には)

于 2012-04-23T04:56:59.313 に答える