SPEED に関する質問です。アクセスするレコードがたくさんあります。
問題に関する基本情報
例として、データベースに 3 つのテーブルがあるとします。
関係: Order-ProductInOrder は 1 対多 (1 つの注文に多くの製品を含めることができます) ProductInOrder- 製品は 1 対 1 (注文内の製品は 1 つの製品で表されます)
public class Order {
public bool Processed { get; set; }
// this determines whether the order has been processed
// - orders that have do not go through this again
public int OrderID { get; set; } //PK
public decimal TotalCost{ get; set; }
public List<ProductInOrder> ProductsInOrder;
// from one-to-many relationship with ProductInOrder
// the rest is irrelevant and will not be included here
}
//represents an product in an order - an order can have many products
public class ProductInOrder {
public int PIOD { get; set; } //PK
public int Quantity{ get; set; }
public int OrderID { get; set; }//FK
public Order TheOrder { get; set; }
// from one-to-many relationship with Order
public int ProductID { get; set; } //FK
public Product TheProduct{ get; set; }
//from one-to-one relationship with Product
}
//information about a product goes here
public class Product {
public int ProductID { get; set; } //PK
public decimal UnitPrice { get; set; } //the cost per item
// the rest is irrelevant to this question
}
割引を適用し、注文の合計金額を見つける必要がある一連の注文を受け取ったとします。これは、10,000 件から 100,000 件を超える注文に適用できます。これが機能する方法は、注文にそれぞれのコストが $100 の製品が 5 つ以上ある場合、合計価格に対して 10% の割引を提供することです。
私が試したこと
私は次のことを試しました:
//this part gets the product in order with over 5 items
List<Order> discountedOrders = orderRepo
.Where(p => p.Processed == false)
.ToList();
List<ProductInOrder> discountedProducts = discountedOrders
.SelectMany(p => p.ProductsInOrder)
.Where(q => q.Quantity >=5 )
.ToList();
discountedProducts = discountedProducts
.Where(p => p.Product.UnitPrice >= 100.00)
.ToList();
discountOrders = discountedOrders
.Where(p => discountProducts.Any(q => q.OrderID == p.OrderID))
.ToList();
これは非常に遅く、実行に永遠に時間がかかります。統合テストを実行すると、テストがタイムアウトしたようです。これを行うためのより速い方法があるかどうか疑問に思っていました。