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 得到条件计数的主要内容,如果未能解决你的问题,请参考以下文章