2

我需要编写一个查询来获取所有销售的运输成本,并将其与估计的运输成本进行比较。这是我的查询:

var sales = (from sale in db.Sales
             where sale.DateOfSale > startDate && sale.DateOfSale < endDate
             group sale by new {sale.ItemID, sale.EstimatedShipping} into g
             select new
             {
                 ItemID = g.Key.ItemID
                 Estimate = g.Key.EstimatedShipping
                 ActualShipCosts = (from gSales in g select gSales.ActualShipping)
             }).ToList();

似乎对未通过键获取组或执行 g.Count() 的组执行任何操作会使查询运行非常缓慢,我无法在不超时的情况下完成此查询。我能做些什么来帮助这里的表现吗?

4

3 回答 3

0

如果没有所有数据库进行测试,很难判断,但这行可能是问题所在:

(from gSales in g select gSales.ActualShipping)

试试这个:

var sales = (from sale in db.Sales
             where sale.DateOfSale > startDate && sale.DateOfSale < endDate
             group sale by new {sale.ItemID, sale.EstimatedShipping} into g
             select new
             {
                 ItemID = g.Key.ItemID,
                 Estimate = g.Key.EstimatedShipping,
                 ActualShipCosts = g.Select(gSales => gSales.ActualShipping).ToList()
             }).ToList();

这防止了第二次from。第一个查询可能会做一些奇怪的连接,而使用简单的 Select 则不应该。

于 2013-10-29T13:52:28.010 回答
0

我认为问题可能是由(from gSales in g select gSales.ActualShipping). Linqgroup by被翻译成group bySQL,因此您无法直接访问表单组的记录。每次调用(from gSales in g select gSales.ActualShipping)都会做单独的选择。

第一个可能的解决方案:在 ItemID、EstimatedShipping 对上创建索引。

第二种可能的解决方案:

var sales = (from sale in db.Sales
         where sale.DateOfSale > startDate && sale.DateOfSale < endDate
         select new
         {
             ItemID = sale.ItemID
             Estimate = sale.EstimatedShipping
             ActualShipCosts = sale.ActualShipping
         }).ToList();

var groupedSales = (from sale in sales
         group sale by new {sale.ItemID, sale.EstimatedShipping} into g
         select new
         {
             ItemID = g.Key.ItemID,
             Estimate = g.Key.EstimatedShipping,
             ActualShipCosts = g.Select(gSales => gSales.ActualShipping).ToList()
         }).ToList();

这将在下载记录后进行离线分组。它肯定会减少查询的数量,但您必须检查您的数据库以查看它是否更快。

于 2013-10-29T14:03:12.830 回答
0

您可以在构建结果集时尝试执行ActualShipping选择:

var sales = db.Sales
    .Where(sale => sale.DateOfSale > startDate && sale.DateOfSale < endDate)
    .GroupBy(
        sale => new {sale.ItemID, sale.EstimatedShipping},
        sale => sale.ActualShipping)
    .ToList();

不确定,但它可能会阻止额外的枚举。

于 2013-10-29T14:04:06.493 回答