Tôi cần dịch SQL
câu lệnh này thành một Linq-Entity
truy vấn ...
SELECT name, count(name) FROM people
GROUP by name
Tôi cần dịch SQL
câu lệnh này thành một Linq-Entity
truy vấn ...
SELECT name, count(name) FROM people
GROUP by name
Câu trả lời:
Nhưng hãy luôn chú ý đến thông báo trong bảng điều khiển / nhật ký. Nếu bạn thấy thông báo rằng truy vấn của bạn không thể chuyển đổi thành SQL và sẽ được đánh giá cục bộ thì bạn có thể cần phải viết lại nó.
Entity Framework 7 (hiện được đổi tên thành Entity Framework Core 1.0 / 2.0 ) chưa hỗ trợ GroupBy()
dịch sang GROUP BY
SQL được tạo (ngay cả trong bản phát hành 1.0 cuối cùng cũng không có). Mọi logic nhóm sẽ chạy ở phía máy khách, điều này có thể khiến nhiều dữ liệu được tải.
Cuối cùng thì mã được viết như thế này sẽ tự động bắt đầu sử dụng GROUP BY, nhưng hiện tại bạn cần phải hết sức thận trọng nếu việc tải toàn bộ tập dữ liệu chưa được nhóm của bạn vào bộ nhớ sẽ gây ra các vấn đề về hiệu suất.
Đối với các tình huống mà đây là một công cụ phá vỡ thỏa thuận, bạn sẽ phải viết SQL bằng tay và thực thi nó thông qua EF.
Nếu nghi ngờ, hãy kích hoạt Sql Profiler và xem những gì được tạo - điều mà bạn có thể nên làm.
https://blogs.msdn.microsoft.com/dotnet/2016/05/16/annocting-entity-framework-core-rc2
Một phần mở rộng hữu ích là thu thập các kết quả trong một Dictionary
tìm kiếm nhanh (ví dụ: trong một vòng lặp):
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);
Ban đầu được tìm thấy tại đây: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c
Đây là một ví dụ đơn giản về nhóm theo .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()};
Dịch sang:
SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]
với EF 6.2 nó đã làm việc cho tôi
var query = context.People
.GroupBy(p => new {p.name})
.Select(g => new { name = g.Key.name, count = g.Count() });