16

これらのクエリのどちらがパフォーマンスの面で優れているか、一方はlinqを使用し、もう一方はネイティブクエリメカニズムを使用します

LINQ

var query =
collection.AsQueryable<Employee>()
.Where(e => e.FirstName == "John")
.Select(e => e); 


NATIVE

var query= Query<Employee>.EQ(e => e.FirstName, "John");
var emp = collection.FindOne(query);

私が理解している限り、linq が最初にコレクション内のすべての項目を取得してから結果をフィルタリングするため、mongoDb のネイティブクエリメカニズムの方が優れていると想定しています。ネイティブのクエリ メカニズムで LINQ を使用することを検討しますか?

4

1 に答える 1

21

私が理解している限りでは、linq が最初にコレクション内のすべてのアイテムを取得し、次に結果をフィルタリングするデータベース内の結果を除外するためです。

いいえ、いいえ、いいえ。データベースレベルですべてをフィルタリングします。

2 つ目は、mongodb クエリを作成するためのネイティブな方法ではありません。これは、実際のネイティブmongod クエリ (たとえば) をビルドするだけの同じラッパー{"a": 1, "b": 2 }です。

最初のクエリでは、式ツリーを使用して mongo クエリを作成します。2 つ目は、リフレクションを使用して同じクエリを作成します。私が知っているように、式ツリーはより高速である必要があります (これ私が見つけた最初の記事です)。とにかく、その性能差は本質的ではないと思います。だからもっと好きなものを使ってください。

私に関しては、ほとんどのクエリに linq を使用しており、一部の開発者は mongo についてあまり知らないかもしれませんが、ここでの欠点は、それがどのようなクエリを作成できるかを実際に理解していない可能性があることです。(たとえば、linq to sql と同じ状況)。ただし、すべてのネイティブ クエリをログに記録し、それらを確認して、最適化や変更の場所を見つけることができます。複雑なクエリの場合、通常は 2 番目の方法を使用します。

于 2012-10-26T07:45:11.527 に答える