使用条件获取Linq计数

使用条件获取Linq计数,linq,entity-framework-core,Linq,Entity Framework Core,我可以在下面的test1中获得一个计数,但是当我尝试获得一个带有条件的计数时,比如在test2中,我会得到以下错误: LINQ表达式。。。无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或ToListSync()的调用显式切换到客户端计算 我正在使用Microsoft.EntityFrameworkCore 3.1.8 var test1 = query .G

我可以在下面的test1中获得一个计数,但是当我尝试获得一个带有条件的计数时,比如在test2中,我会得到以下错误:

LINQ表达式。。。无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或ToListSync()的调用显式切换到客户端计算

我正在使用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)
             });

这是EF核心的局限性。但好消息是,您可以通过
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)
   }

该错误属于实体框架。您应该指定当前使用的版本。您是否尝试了不带
string.Format
的同一查询?是的,我刚刚删除了string.Format,它似乎只在我向计数添加条件时出现,多次计数不是问题。谢谢,我还没有测试,但我假设它可以工作。我通过从原始查询中获取计数来实现它,这是一个技巧,但它是有效的: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开始,它没有更多的限制。