1

私が解決策を見つけたので、実際の質問よりも明確な質問です。理屈だけではわからない…

SQLLite 3.8.3.1 を使用する SQLite-net 2.1 を使用する

a の実行と a の実行には明確な違いが.Where(lambda).FirstOrDefault()あり.FirstOrDefault(lambda)ます。

Linq での私の経験によると、データベース LINQ プロバイダーはこれらの両方を本質的に同じように扱います (.FirstOrDefault(lambda)適切に最適化されている場合は少し速くなる可能性がありますが、概して、これら 2 つの呼び出しの実行にはほぼ同じ時間がかかります)。

ただし、SQLite-net では、約 40,000 レコードを含むテーブルで次の結果が表示されます。

実行.FirstOrDefault(x => x.Id == id)中、Core-i7 にかかる時間が2200ms から 3700msの間であることがわかります。Surface RT (第 1 世代) では、実際には約 20,000 ミリ秒から 30,000 ミリ秒かかります。

を実行する.Where(x => x.Id == id).FirstOrDefault()と、同じ Core-i7 にかかる時間が16ms から 20msの間であることがわかります。Surface RT では、これには約 30 ミリ秒かかります。

私の質問は、これが単なるバグなのか、それとも意識的な設計上の決定なのかということです。それが設計上の決定である場合、その背後にある理由を理解したいと思います.

4

1 に答える 1

3

.Where.FirstOrDefault(lambda)データベースからフィルタリングされていないレコードを読み取り、それらが一致するかどうかをチェックしながら、SQL WHERE 句に直接変換されます。

理論的には、後者を前者に自動的に変換することは可能ですが、実際にはこれは行われません。これは意図的な設計上の決定でもバグでもありません。理論的に可能な最適化が実装されていないだけです。

于 2014-04-20T22:16:42.693 に答える