实体框架核心不会生成“按SQL分组”指令吗?

时间:2019-12-04 10:48:12

标签: c# linq entity-framework-core npgsql

我有下表:

enter image description here

我需要获取3个列表:

  • 所有广告客户(明显);
  • 所有类别(不同);
  • 所有程序包ID(不同)。

我有以下LINQ:

var filtersData = from push in _pushRepository.Pushes.Select(x =>  new
                {
                    x.Advertiser,
                    x.Category,
                    x.PackageId
                })
                group push by new
                {
                    push.Advertiser,
                    push.Category,
                    push.PackageId

                }
                into gr
                select  new
                {
                    advertisers = gr.Select(x => x.Advertiser).Distinct(),
                    categories = gr.Select(x => x.Category).Distinct(),                    
                    appIds = gr.Select(x => x.PackageId).Distinct()
                };

它非常接近此SQL查询:

        SELECT x."Advertiser", x."Category", x."PackageId"
FROM "Pushes" AS x
group by  x."Advertiser", x."Category", x."PackageId"

但没有distinct

我已经打开了npgsql的查询日志记录。这让我感到惊讶,但是LINQ指令不会生成Group by。请查看控制台调试输出:

enter image description here

这是正确的行为,并且EF Core将借助内部机制进行分组,或者LINQ中存在我的错误?

P.S。我使用.NET Core 2.2

1 个答案:

答案 0 :(得分:1)

正如@ gert-arnold在评论中所写,您对GroupBy的用法无法转换为SQL-必须为此应用聚合运算符。阅读the documentation可以更好地了解EF Core可以翻译哪些案件。

您仍然可以通过在GroupBy运算符之前插入一个AsEnumerable在客户端执行GroupBy。