【问题标题】:Entity Core 2.0.3 Exception: must be reducible nodeEntity Core 2.0.3 例外:必须是可简化节点
【发布时间】:2019-02-27 02:39:28
【问题描述】:

我正在尝试将以下 sql 查询转换为 EF

sql查询

Select  Sum([KiloWatt]) as 'Sum',
    Min([KiloWatt]) as 'Min',
    Max([KiloWatt]) as 'Max',
    Sum([KiloWatt])/COUNT([KiloWatt]) as 'Average',
    CONVERT(date, [DateTime]) 
from OneHourElectricitys 
where [DateTime] < SYSDATETIME()
group by CONVERT(date, [DateTime])

EF 代码

var analytics = await _analyticsRepository.Query().Where(x => x.DateTime.Subtract(DateTime.Today).Days < 0)
                                                  .GroupBy(x => x.DateTime.Date)
                                                  .Select(x => new 
                                                    { DateTime = x.Key, 
                                                      Max = x.Max(y => y.KiloWatt),
                                                      Min = x.Min(y => y.KiloWatt),
                                                      Avg = x.Sum(y => y.KiloWatt)/ x.Count(),
                                                      Sum = x.Sum(y => y.KiloWatt)
                                                    })
                                                  .ToListAsync();

堆栈跟踪:-

System.ArgumentException: 必须是可约节点 在 System.Linq.Expressions.Expression.ReduceAndCheck() 在 System.Linq.Expressions.Expression.ReduceExtensions()

我做错了吗?

-- 更新--

以下 2 个 EF 查询运行良好,但将它们组合起来会出现错误。

var analytics = await _analyticsRepository.Query().Where(x => x.DateTime.Subtract(DateTime.Today).Days < 0)

var analytics = await _analyticsRepository.Query().GroupBy(x => x.DateTime.Date)
                                              .Select(x => new 
                                                { DateTime = x.Key, 
                                                  Max = x.Max(y => y.KiloWatt),
                                                  Min = x.Min(y => y.KiloWatt),
                                                  Avg = x.Sum(y => y.KiloWatt)/ x.Count(),
                                                  Sum = x.Sum(y => y.KiloWatt)
                                                })
                                              .ToListAsync();

【问题讨论】:

  • 在 EF Core 2.0.3 上试过,无法重现。还可以考虑升级到 2.1.3 - 以及包含 GroupBy 优化的修复(转换为 SQL,而不是像您使用的版本那样执行客户端)。
  • 嗨@IvanStoev,感谢您的评论。一旦我更新到 2.1.3,我就能够成功编译和运行。请将此作为答案。

标签: c# entity-framework entity-framework-core ef-core-2.0


【解决方案1】:

这是我的解决方案,它有效。

var analytics = await (_analyticsRepository.Query()
                .Where(x => x.PanelId.Equals(panelId, StringComparison.CurrentCultureIgnoreCase)
                && DateTime.Compare(x.DateTime, new DateTime()) < 0))
            .GroupBy(x => x.DateTime.Date)
                .Select(x => new
                {
                    DateTime = x.Key,
                    Max = x.Max(y => y.KiloWatt),
                    Min = x.Min(y => y.KiloWatt),
                    Avg = x.Sum(y => y.KiloWatt) / x.Count(),
                    Sum = x.Sum(y => y.KiloWatt)
                }).ToListAsync();

谢谢,

【讨论】:

    【解决方案2】:

    此问题的正确解决方案是升级到 Ivan Stoev 提到的 EF Core 2.1.3

    【讨论】:

      【解决方案3】:

      使用

       DateTimeField.Year +""+ DateTimeField.Month  //Use this 
      

      而不是为日期使用自定义格式

       DateTimeField.ToString("yyyy - MM") //Don't use this
      

      帮我解决了问题

      顺便说一句,我的 .net 核心版本是 2.2.x

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-09
        • 2018-12-25
        • 1970-01-01
        • 1970-01-01
        • 2021-04-25
        • 1970-01-01
        相关资源
        最近更新 更多