【发布时间】:2013-12-17 08:56:11
【问题描述】:
这是我的表达:
var d = DateTime.Now.AddDays(-60);
return db.Orders
.Where(o => o.CreateDate > d && o.Status > 3)
.Join(db.OrderItems, o => o.OrderId, o => o.OrderId, (o, p) => new { Order = o, OrderItem = p })
.Join(db.Customers, o => o.Order.CustomerId, o => o.CustomerId, (o, p) => new { o.Order, o.OrderItem, Customer = p })
.GroupBy(p => new {p.Customer.CustomerId, p.Customer.Name})
.Select(o => new CustomerMonthSale
{
CustomerId = o.Key.CustomerId,
Name = o.Key.Name,
Price = o.Sum(p => p.OrderItem.Price * p.OrderItem.Quantity)
})
.OrderByDescending(o => o.Price)
.Take(10).ToList();
需要 6 秒。它应该提供大约 100 条记录,但在此查询结束时,我得到前 10 名。当计算订单和 orderItems 时,它可能访问几千条记录。我怀疑问题出在数据库的大小上,因为我有类似的表达式来访问 6 倍大的数据量并且需要 400 毫秒。我认为它与选择有关...但实际上我不知道。
【问题讨论】:
-
执行需要多长时间?您正在访问多少条记录?
-
需要 6 秒。它应该提供大约 100 条记录,但在此查询结束时,我得到前 10 名。当计算订单和 orderItems 时,它可能访问几千条记录。我怀疑问题出在数据库的大小上,因为我有类似的表达式来访问 6 倍大的数据量并且需要 400 毫秒。我认为它与选择有关...但实际上我不知道。
标签: c# lambda query-optimization