SQL to Entity Framework Đếm từng nhóm


Câu trả lời:


180

Cú pháp truy vấn

var query = from p in context.People
            group p by p.name into g
            select new
            {
              name = g.Key,
              count = g.Count()
            };

Cú pháp phương pháp

var query = context.People
                   .GroupBy(p => p.name)
                   .Select(g => new { name = g.Key, count = g.Count() });

22

Chỉnh sửa: EF Core 2.1 cuối cùng cũng hỗ trợ GroupBy

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 BYSQL đượ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


5
Cảm ơn cho người đứng đầu lên
Jacob Stamm

4
Cũng không có nhóm nào trong 1.1
Simon_Weaver

4
hoặc 1.2 hoặc 2.0. Tôi bỏ cuộc
Simon_Weaver

4
nó được công bố cho 2.1
Yush

Điều này có thể gây hiểu lầm, tôi nghĩ điều quan trọng là phải cập nhật câu trả lời của bạn và đề cập rõ ràng rằng các phiên bản EF sớm hơn EF 7 có hỗ trợ nhóm. Câu trả lời này mang tính bình luận nhiều hơn là một câu trả lời thực tế cho câu hỏi OP sẽ gây hiểu lầm khi tự đọc (và được hiểu là câu trả lời cho câu hỏi OP không phải). Khi đọc điều này, người ta có thể có ấn tượng sai như thể ngay cả EF 7 không hỗ trợ phân nhóm và rõ ràng là các phiên bản trước đó không hỗ trợ nó, điều này không đúng.
BornToCode

14

Một phần mở rộng hữu ích là thu thập các kết quả trong một Dictionarytì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


1

Đâ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]

0

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() });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.