2

あらゆる種類の複雑で単純な選択クエリを実行するシステムがあります。

いくつかの簡単なテストを行って、次の結果を得ました。

Query 3.9 seconds :
var result = (from temp in context.model
               where temp.ID == 1302
               select temp).First();

Start Transaction time: 17:54:58.7073806
End Transaction time: 17:55:02.6246046

Query 3.7 seconds :
Model modelResult = context.Model.Find(1302);

Start Transaction time: 17:53:51.1995194
End Transaction time: 17:53:54.8737295

私は最良の選択肢が何であるかを理解しようとして読んでいます。このサイトではこのトピックについて多くの会話がありますが、私は必要なものを正確に見つけられませんでした。

クエリの選択は状況に応じて(クエリの複雑さなどに基づいて)行われることは知っていますが、キーに基づいて単一のエンティティが必要な場合は、再度使用されることはありません(つまり、検索の場合、キャッシュは行われません。そのクエリが再度呼び出される可能性は非常に低いため、重要です)直接LINQを使用するか、検索を引き続き使用する方がよいでしょうか。

検索の結果を使用しないときにキャッシュするコストは高すぎますか?単純なテストの結果は、単一のエンティティ/キーの状況で検索が常に高速になると想定するのに十分正確ですか?

トレースをオフにしてLINQをテストしませんでしたが、これは2つの例よりも優れたアプローチでしょうか?

4

1 に答える 1

5

2つはまったく同じではありません。

Findエンティティがコンテキストに既にロードされているかどうかを確認します。ある場合は、クエリを実行せずにそれを返します。このシナリオでは、はるかに効率的である可能性があります。

ただし、エンティティがコンテキスト内にない場合はSingleOrDefault、サーバーから上位 2 つの結果を取得する必要がある最初のクエリではなく、より類似したクエリを実行します。クエリの構築にオーバーヘッドはありませんが、そのためにクエリ自体が (非常にわずかに) 遅くなる可能性があり、複数の一致がある場合にエラーが発生するため、結果が異なります。

生成されたクエリを含む詳細と情報については、このSlauma の回答を参照してください

于 2012-09-20T17:14:50.683 に答える