EF Core 5预览版计算分类下帖子总数遇LINQ翻译异常如何解决?
解决EF Core 5预览版中分类下帖子总数统计的查询翻译异常问题
嘿,这个问题我之前也碰到过,本质是EF Core的查询翻译器没办法把你写的那种多层嵌套Sum的LINQ表达式转换成对应的SQL语句。咱们直接上靠谱的解决方案:
方案一:从Post表反向关联查询(推荐,更高效)
与其从Category一层层往下Include,不如直接从Post出发,向上关联到对应的Category再分组统计——这种写法EF Core能完美翻译,生成的SQL也更高效,因为是直接统计Post表的有效记录数。
var result = dataRepository.Posts .GroupBy(post => post.Topic.Forum.Category.Name) .Select(group => new { Category = group.Key, PostCount = group.Count() }) .ToList();
如果你的数据模型里存在导航属性可能为null的情况(比如极少数Post没关联Topic),可以加上空值过滤避免报错:
var result = dataRepository.Posts .Where(post => post.Topic != null && post.Topic.Forum != null && post.Topic.Forum.Category != null) .GroupBy(post => post.Topic.Forum.Category.Name) .Select(group => new { Category = group.Key, PostCount = group.Count() }) .ToList();
方案二:从Category出发,扁平化层级后统计
如果一定要从Category开始查询,那咱们用SelectMany把多层嵌套的集合扁平化,再直接统计总数,这样就能避开EF翻译不了的多层Sum嵌套:
var result = dataRepository.Categories .Select(category => new { CategoryName = category.Name, PostCount = category.Forums .SelectMany(forum => forum.Topics) .SelectMany(topic => topic.Posts) .Count() }) .ToList();
为啥原来的查询会报错?
你原来的代码用了三层嵌套的Sum:category.Sum(forum => forum.Forums.Sum(topic => topic.Topics.Sum(post => post.Posts.Count()))),这种多层嵌套的聚合操作,EF Core(哪怕是5.0预览版)的查询翻译器还没法处理,没办法转换成对应的SQL聚合逻辑。而上面两种方法要么反向查询,要么扁平化层级,都是EF能正确识别并翻译的形式。
内容的提问来源于stack exchange,提问作者A191919
相关产品推荐
相关产品推荐

