按月/年减慢EF查询分组数据

时间:2015-10-09 17:26:50

标签: c# mysql entity-framework ef-code-first

我有大约100万条记录的记录集。我正在尝试查询记录以报告月度数据。

以下MySQL查询在大约0.3秒内执行

SELECT SUM(total), MONTH(create_datetime), YEAR(create_datetime) 
FROM orders GROUP BY MONTH(create_datetime), YEAR(create_datetime)

但是我无法找出一个实体框架lambda表达式,它可以执行任何近似

我提出的唯一有效的陈述是

var monthlySales = db.Orders
                     .Select(c => new
                     {
                         Total = c.Total,
                         CreateDateTime = c.CreateDateTime
                     })
                     .GroupBy(c => new { c.CreateDateTime.Year, c.CreateDateTime.Month })
                     .Select(c => new
                     {
                         CreateDateTime = c.FirstOrDefault().CreateDateTime,
                         Total = c.Sum(d => d.Total)
                     })
                     .OrderBy(c => c.CreateDateTime)
                     .ToList();

但它非常缓慢。

如何让这个查询在MySQL中直接执行

3 个答案:

答案 0 :(得分:0)

当您在查询中间执行“.ToList()”时(在进行分组之前),EF将有效地查询内存中数据库的所有订单,然后在C#中进行分组。根据表格中的数据量,这可能需要一段时间,我认为这就是您的查询速度太慢的原因。

尝试重写只有1个枚举结果的表达式的查询(ToList,ToArray,AsEnumerable)

答案 1 :(得分:0)

试试这个:

var monthlySales = from c in db.Orders
                   group c by new { y = c.CreateDateTime.Year, m = c.CreateDateTime.Month } into g
                   select new {
                       Total = c.Sum(t => t.Total),
                       Year = g.Key.y,
                       Month = g.Key.m }).ToList();

答案 2 :(得分:0)

我遇到了这个快速执行的设置

            var monthlySales = db.Orders
                 .GroupBy(c => new { Year = c.CreateDateTime.Year, Month = c.CreateDateTime.Month })
                 .Select(c => new
                 {
                     Month = c.Key.Month,
                     Year = c.Key.Year,
                     Total = c.Sum(d => d.Total)
                 })
                 .OrderByDescending(a => a.Year)
                 .ThenByDescending(a => a.Month)
                 .ToList();