gpt4 book ai didi

c# - 优化还是放弃 LINQ 查询?

转载 作者:行者123 更新时间:2023-11-30 20:52:08 25 4
gpt4 key购买 nike

所以我有一个 LINQ (to 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

点击clients列的求和函数会显示如下网格数据:

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+名称:.GroupBy(m => new{m.ID, m.Name})

您应该会发现生成的 SQL 现在将是单个语句,而不是主语句加上每个组的语句。

关于c# - 优化还是放弃 LINQ 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21190358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com