0

customerメインエンティティと関連エンティティ(注文)の両方のクエリをコンパイルしました。

var customer = MyService.GetCustomer<Customer>().where(c => c.Id == fooId).ToList();
var customerOrders = MyService.GetOrders<Order>().where(o => o.CustomerId == fooId && o.IsActive).ToList();

customerしかし、以下のコードによって既にメモリにロードされているため、コンパイルされたクエリ呼び出しの代わりにナビゲーション プロパティを介してすべての注文を取得できると思います。

var customerOrders = customer.Orders.where(o => o.IsActive).ToList();  // I didn't do filter further more

しかし、タイミングを測定すると、大きな違いは見つかりませんでした (DB には 500 の顧客と 4000 の注文があります。特定の顧客ごとに 30 のアクティブな注文と約 400 の非アクティブな注文があります)。

この2つのうち、どちらがより優れたパフォーマンスを発揮しますか?

この関連する質問を完全に理解できませんでした

4

2 に答える 2

0

あなたの方法はあなたのケースに依存します。関連エンティティを積極的に使用する場合: これをクエリに含める最良の方法:

using System.Data.Entity;
...
var customer = MyService.GetCustomer<Customer>().where(c => c.Id == fooId).Include(u => u.Orders).ToList();

それ以外の場合は、遅延読み込みを優先します。

于 2015-01-21T08:28:31.257 に答える
0

Linq to Entities は、Linq クエリを SQL に変換します。

var customer = MyService.GetCustomer<Customer>().where(c => c.Id == fooId).ToList();

c.Id は一意であるため、これは実際には単純化できます。

Customer customer = MyService.GetCustomer<Customer>().SingleOrDefault(c=> c.Id == fooId);

ここで行うことは、最初に特定の ID を持つ顧客を取得することです。(定数であり、クエリする注文数には依存しません)

次に、この顧客の注文をクエリします (このクエリは、この顧客の注文数に依存します)。

var customerOrders = customer.Orders.where(o => o.IsActive).ToList();

次に、上記とまったく同じ SQL ステートメントにつながる別のクエリを実行します。

var customerOrders = MyService.GetOrders<Order>().where(o => o.CustomerId == fooId && o.IsActive).ToList();

これが、パフォーマンスの違いが最初のクエリだけである理由です。

于 2015-01-21T06:58:04.470 に答える