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

标签 c# sql linq linq-to-sql

所以我有一个 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/

相关文章:

c# - 在 FrameWork 级别捕获 WPF 中的异常

c# - 尝试将密码存储到数据库

c# - 如何根据用户角色操作 WPF GUI

mysql - 如何获取列中每个不同值的计数?

对多个日期字段进行分组的 SQL 查询

c# - 不强制转换返回类型的单元测试 IHttpActionResult

sql - 选择数据并将其显示为列标题

c# - LINQ 之后的下一件大事是什么?

c# - 如何使用 LINQ 计算 DataTable 的总和?

c# - 如何在 C# 中合并和更新列表的节点