Sto usando Entity framework Core 2.1.4 e ho scritto una query di esempio di base da C # come di seguito.
var myList = context.HastaAdres.OrderBy(p => p.ID).Take(20).GroupBy(p => p.IlKodu).Select(d => d.FirstOrDefault()).Select(p => p.ID).ToList();
Ma nel profiler SQL, eseguendo il codice come di seguito. Non esiste un gruppo in SQL e molto diverso dal classico framework di entità. Quindi, anche il risultato è diverso. Di conseguenza ho bisogno di una sola colonna. Ma prima query, restituisce tutte le colonne. Inoltre, il conteggio delle righe è diverso dalla seconda query.
SQL generato da Entity framework Core
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]
Quando ho provato questo metodo in Entity Framework, sta generando un codice perfetto.
SQL generato da Entity framework
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]
Quale può essere la ragione di questa situazione?
Ho imparato che EF Core non supporta il livello di database Group By e prende element. Ma, da parte di EF Core 2.1, è arrivato il supporto per il gruppo in base alla somma, min, max, media a livello di database (è possibile vedere da questo link https://docs.microsoft.com/en-us/ef/core/what -is-new / ef-core-2.1 # linq-groupby-translation commentato da @jpgrassi)
Quindi, ho modificato il mio codice di query come valore minimo e quindi ho ottenuto quella riga dal database. Quindi, questo ha risolto il mio problema. Ma, spero, la volta più recente, Microsoft supporta il gruppo a livello di database.