所以我有一个 LINQ(到 SQL)查询,它将信息从数据库提取到网格中。有一个函数可以根据当前过滤器参数聚合网格数据,该参数将对网格数据中重复出现的“X”的数量进行求和。
例如,假设网格显示顾客访问一家杂货店。原始数据可能显示如下:
Date | Name | No. Prod | Total $
--------------------------------------------
01/02/13 | Customer A | 4 products | $23.00
01/02/13 | Customer B | 2 products | $3.26
01/02/13 | Customer C | 7 products | $47.42
01/16/13 | Customer A | 3 products | $26.22
点击客户栏的求和功能将显示以下网格数据:
Cnt| Name | Tot. Prod | Total $
--------------------------------------
2 | Customer A | 7 products | $49.22
1 | Customer B | 2 products | $3.26
1 | Customer C | 7 products | $47.42
我的问题是我正在 LINQ 查询中执行求和逻辑。我以为这会很快......但事实恰恰相反。这是一个示例。
Expression<Func<OrdersView, bool>> filter;
filter = m => m.RecordCreated >= fromDate && m.RecordCreated <= toDate && m.DepartmentID == _depID;
var ClientAggOrders = dataContext.OrdersView
.Where(filter)
.GroupBy(m => m.Name)
.Select(gr => new
{
Name = gr.Key,
Count = gr.Where(s => s.ID != null).Count(),
id = gr.Select(s => s.ID),
S1 = gr.Sum(s => s.Tare < s.Gross ? s.Tare : s.Gross),
S2 = gr.Sum(s => s.Tare < s.Gross ? s.Gross : s.Tare),
NetWeight = gr.Sum(s => s.NetWeight),
Price = gr.Sum(s => s.NetPrice)
}
).ToList();
我的问题是,为什么这种做法如此糟糕? LINQ 允许在 SELECT 子句中使用这些表达式,但执行所需的时间太荒谬了,以至于我认为它在任何现实场景中都没有好处。
我使用 LINQ 是否错误,我应该将逻辑移到查询之外,还是可以在 LINQ 内正确优化和完成?感谢您的建议!
最佳答案
您可以使用 LINQPad 查看生成的 SQL。
由于 LINQ to SQL 的工作方式,id = gr.Select(s => s.ID)
会导致对每个组执行一个子查询。删除它,并在 GroupBy 中获取 ID+Name:.GroupBy(m => new{m.ID, m.Name})
您应该发现生成的 SQL 现在将是单个语句,而不是主语句加上每个组的语句。
关于c# - 优化还是放弃 LINQ 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21190358/