Linq 得到条件计数

Posted

技术标签:

【中文标题】Linq 得到条件计数【英文标题】:Linq getting count with condition 【发布时间】:2021-01-30 03:31:45 【问题描述】:

我可以在下面的 test1 中获得计数,但是当我尝试在条件下获得计数时,例如在 test2 中,我收到此错误:

无法翻译 LINQ 表达式...。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。

我正在使用 Microsoft.EntityFrameworkCore 3.1.8

        var test1 = query
             .GroupBy(g => new  g.CreationTime.Year, g.CreationTime.Month, g.CreationTime.Day )
             .OrderBy(o => o.Key.Year).ThenBy(o => o.Key.Month).ThenBy(o => o.Key.Day)
             .Select(g => new 
                 Key = g.Key.Month,
                 Count = g.Count()
             );


        var test2 = query
             .GroupBy(g => new  g.CreationTime.Year, g.CreationTime.Month, g.CreationTime.Day )
             .OrderBy(o => o.Key.Year).ThenBy(o => o.Key.Month).ThenBy(o => o.Key.Day)
             .Select(g => new 
                 Key = g.Key.Month,
                 Count = g.Count(x => g.Key.Month == 1)
             );

【问题讨论】:

该错误属于实体框架。您应该指定您当前使用的版本。 你是否在没有string.Format的情况下尝试过相同的查询 是的,我刚刚删除了string.format,看起来只有在计数中添加条件时才会出现,多次计数不是问题。 【参考方案1】:

这是 EF Core 的限制。但好消息是您可以通过Sum 聚合函数来模拟此查询。

var test = 
   from q in query
   group q by new 
     
        q.CreationTime.Year, 
        q.CreationTime.Month, 
        q.CreationTime.Day
      into g
   select new 
   
      Key   = g.Key.Month,
      Count = g.Sum(x => x.Month == 1 ? 1 : 0)
   

【讨论】:

谢谢,我还没有测试过,但我认为它可以工作。我通过从原始查询中获取计数来使其工作,这是一个hack,但它有效:Count = query.Count(c => c.CreationTime.Month == 10 && c.CreationTime.Year == x.Key .Year && c.CreationTime.Month == x.Key.Month && c.CreationTime.Day == x.Key.Day) 从 EFC 5.0 开始,不再有任何限制。

以上是关于Linq 得到条件计数的主要内容,如果未能解决你的问题,请参考以下文章

使用表达式方法的 LINQ 计数子句中的 if 条件

计数错误,但我没有在我的 LINQ 表达式中使用计数,

LINQ 根据计数 >1 的另一列获取列

计数错误但我在LINQ表达式中没有使用Count,

Linq 不重复计数

Linq 计数错误(列)