0

外部キーなどを備えた稼働中の EF システムを使用して、ショップまたはショップ チェーンのすべての顧客データを引き出すことができます。

次のコードを使用してデータを取得します。

var foo = from s in context.Shops
        where (s.ShopId == shopId)
        select s;

Shop には、次のように定義されたナビゲーション プロパティがあります。

 [ForeignKey("ShopId")] 
 public virtual ICollection<CustomerOrder> CustomerOrders { get; set; }

特に、CustomerOrder にはステータスと完了日が含まれています。

したがって、現在私のコードには、特定の日付以降に完了したすべての完了した注文 (ステータス 7) を返す次のものがあります。

[NotMapped]
public virtual List<CustomerOrder> TotalCompletedCustomerOrders(DateTime dt)
{
    return (from co in CustomerOrders where co.Status == 7 && co.CompletedDate > dt select co).ToList();            
}

これは、データを取得するための最も効率的な方法ですか? (コレクションが列挙されるまで顧客の注文が取得されないことを理解していますが、それでもシステムは、日付の後に完了したものを見つけるために潜在的に数千のレコードを処理する必要があります。ステータスおよび/または日付を元のクエリ?

次のいくつかのバリエーションを試しましたが、どれも機能しません。

where (d.ParentBusinessId == parentId && (d.CustomerOrders.Select(co => co.Status == 7)))

それとも、このプロセスをオーバーエンジニアリングしていますか? (理論的には、データベースからデータを選択してステータスとオプションの日付を取得するメソッドが必要なため、データを Web ページに渡すときは、それを提示するだけです)

4

1 に答える 1

0

この場合の「システム」はSQLサーバーであり、それははるかに大きなセットからデータのセットを選択する仕事です。パフォーマンスが良くない場合は、クエリ実行計画に注意を払う必要がありますが、SQL Server がはるかに大きなセットからレコードのサブセットを処理する必要があることを心配するという考えは、SQL サーバーを持つことの要点です。これを行うのは非常に効率的です。

元のクエリは、ほとんどの場合、副選択を行うように最適化されているため、EF と SQL Server にその仕事を任せてください。パフォーマンスの問題がある場合は、それに対処してください。

于 2013-04-26T13:35:17.980 に答える