C# Linq GroupBy,获取每个组中一列的列表
本文关键字:一列 列表 GroupBy Linq 获取 | 更新日期: 2023-09-27 18:37:13
我需要编写一个查询来获取销售的所有运输成本,并将其与估计的运输成本进行比较。 这是我的查询:
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() 的组执行任何操作会使查询运行非常慢,我无法在不超时的情况下完成此查询。 我能做些什么来帮助这里的表现吗?
您可以尝试在生成结果集时执行实际运输选择:
var sales = db.Sales
.Where(sale => sale.DateOfSale > startDate && sale.DateOfSale < endDate)
.GroupBy(
sale => new {sale.ItemID, sale.EstimatedShipping},
sale => sale.ActualShipping)
.ToList();
不确定,但它可能会阻止其他枚举。
我认为问题可能是由(from gSales in g select gSales.ActualShipping)
引起的。Linq group by
在 SQL 中转换为group by
,因此您无法直接访问表单组的记录。(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();
这将在下载记录后进行脱机分组。它肯定会减少查询数量,但您必须检查您的数据库以查看它是否更快。
如果没有所有用于测试的数据库,很难分辨,但这一行可能是问题所在:
(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 则不应执行。