Muszę przetłumaczyć to SQL
oświadczenie na Linq-Entity
zapytanie ...
SELECT name, count(name) FROM people
GROUP by name
Muszę przetłumaczyć to SQL
oświadczenie na Linq-Entity
zapytanie ...
SELECT name, count(name) FROM people
GROUP by name
Odpowiedzi:
Ale zawsze szukaj komunikatów w konsoli / dzienniku. Jeśli zobaczysz powiadomienie, że Twoje zapytanie nie może zostać przekonwertowane na SQL i zostanie ocenione lokalnie, może być konieczne jego przepisanie.
Entity Framework 7 (teraz zmieniona na Entity Framework Core 1.0 / 2.0 ) nie obsługuje jeszcze GroupBy()
tłumaczenia na GROUP BY
w wygenerowanym SQL (nawet w ostatecznej wersji 1.0 nie będzie). Dowolna logika grupowania będzie działać po stronie klienta, co może spowodować załadowanie dużej ilości danych.
W końcu kod napisany w ten sposób automatycznie zacznie używać GROUP BY, ale na razie musisz być bardzo ostrożny, jeśli załadowanie całego niezgrupowanego zestawu danych do pamięci spowoduje problemy z wydajnością.
W scenariuszach, w których jest to łamanie umowy, będziesz musiał ręcznie napisać SQL i wykonać go za pomocą EF.
Jeśli masz wątpliwości, uruchom Sql Profiler i zobacz, co jest generowane - co i tak prawdopodobnie powinieneś zrobić.
https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2
Przydatnym rozszerzeniem jest zbieranie wyników w Dictionary
celu szybkiego wyszukiwania (np. W pętli):
var resultDict = _dbContext.Projects
.Where(p => p.Status == ProjectStatus.Active)
.GroupBy(f => f.Country)
.Select(g => new { country = g.Key, count = g.Count() })
.ToDictionary(k => k.country, i => i.count);
Pierwotnie znaleziony tutaj: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c
Oto prosty przykład grupowania według .net core 2.1
var query = this.DbContext.Notifications.
Where(n=> n.Sent == false).
GroupBy(n => new { n.AppUserId })
.Select(g => new { AppUserId = g.Key, Count = g.Count() });
var query2 = from n in this.DbContext.Notifications
where n.Sent == false
group n by n.AppUserId into g
select new { id = g.Key, Count = g.Count()};
Co przekłada się na:
SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]
z EF 6.2 to zadziałało dla mnie
var query = context.People
.GroupBy(p => new {p.name})
.Select(g => new { name = g.Key.name, count = g.Count() });