Entity Framework Core 2.1 组无法正常工作

rea*_*ist 2 .net c# entity-framework entity-framework-core asp.net-core

我正在使用实体框架 Core 2.1.4,我从 C# 中编写了一个基本示例查询,如下所示。

var myList = context.HastaAdres.OrderBy(p => p.ID).Take(20).GroupBy(p => p.IlKodu).Select(d => d.FirstOrDefault()).Select(p => p.ID).ToList();
Run Code Online (Sandbox Code Playgroud)

但是在 SQL 探查器中,运行如下代码。SQL 中没有 group by,与经典的实体框架非常不同。所以,结果也不一样。结果我只需要一列。但是第一次查询,返回所有列。行数也不同于第二个查询。

由实体框架核心生成的 SQL

SELECT [t].[ID], [t].[IlKodu], [t].[AcikAdres], [t].[BucakAdi], [t].[BucakKodu], [t].[BulvarKodu], [t].[CaddeKodu], [t].[CreatedBy], [t].[CreatedDate]
FROM (
    SELECT TOP(20) [p].[ID], [p].[IlKodu], [p].[AcikAdres], [p].[BucakAdi], [p].[BucakKodu], [p].[BulvarKodu], [p].[CaddeKodu], [p].[CreatedBy], [p].[CreatedDate]
    FROM [Ortak].[HastaAdres] AS [p]
    ORDER BY [p].[ID]
) AS [t]
ORDER BY [t].[IlKodu]
Run Code Online (Sandbox Code Playgroud)

当我在 Entity Framework 中尝试这种方法时,它生成了完美的代码。

由实体框架生成的 SQL

SELECT 
    (SELECT TOP (1) 
        [Limit2].[ID] AS [ID]
        FROM ( SELECT TOP (20) [Extent2].[ID] AS [ID], [Extent2].[IlKodu] AS [IlKodu]
            FROM [Ortak].[HastaAdres] AS [Extent2]
            ORDER BY [Extent2].[ID] ASC
        )  AS [Limit2]
        WHERE ([Distinct1].[IlKodu] = [Limit2].[IlKodu]) OR (([Distinct1].[IlKodu] IS NULL) AND ([Limit2].[IlKodu] IS NULL))) AS [C1]
    FROM ( SELECT DISTINCT [distinct].[IlKodu] AS [IlKodu]
        FROM ( SELECT TOP (20) 
            [Extent1].[IlKodu] AS [IlKodu]
            FROM [Ortak].[HastaAdres] AS [Extent1]
            ORDER BY [Extent1].[ID] ASC
        )  AS [distinct]
    )  AS [Distinct1]
Run Code Online (Sandbox Code Playgroud)

这种情况的原因是什么?

rea*_*ist 5

我了解到 EF Core 不支持数据库级别的 Group By 和 take element。但是,通过 EF Core 2.1,在数据库级别支持 group by then sum,mi​​n,max,average。(你可以从这个链接看到https://docs.microsoft.com/en-us/ef/core/what -is-new/ef-core-2.1#linq-groupby-translation来自 @jpgrassi 评论)

因此,我将查询代码更改为取最小值,然后从数据库中获取该行。所以,这解决了我的问题。但是,我希望最近一次,Microsoft 在数据库级别支持 group by。