首页 > 解决方案 > EFCore 3 GroupBy+ToDictionary 引发客户端 GroupBy 不支持

问题描述

以下GroupBy查询无法翻译,将引发错误:client side GroupBy is not supported

IEnumerable<int> ids = new List<int> { 1, 2, 3 };
var q = db.Comments.Where(x => ids.Contains(x.Identifier))
    .GroupBy(x => x.Identifier);
var map = await q.ToDictionaryAsync(x => x.Key, x => x.Count());

应该如何重新安排查询以便能够在 dbms 上运行?

标签: c#linqentity-framework-coreef-core-3.0

解决方案


在任何分组依据之后,应该有一个仅使用组键(及其属性)和聚合的 Select 语句。这类似于Sql语言的限制。作为优化,EF 核心团队可能支持调用ToDictionary具有相同的限制,但他们没有,所以我们需要手动进行:

IEnumerable<int> ids = new List<int> { 1, 2, 3 };
var q = db.Comments.Where(x => ids.Contains(x.Identifier))
    .GroupBy(x => x.Identifier)
    .Select(x => new { x.Key, Count = x.Count()});
var map = await q.ToDictionaryAsync(x => x.Key, x => x.Count);

这将被成功翻译。


推荐阅读