SQL ไปยัง Entity Framework Count Group-By


คำตอบ:


190

ไวยากรณ์การสืบค้น

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

ไวยากรณ์ของวิธีการ

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

22

แก้ไข: ในที่สุด EF Core 2.1 รองรับGroupBy

แต่ระวังข้อความในคอนโซล / บันทึกเสมอ หากคุณเห็นการแจ้งเตือนว่าแบบสอบถามของคุณไม่สามารถแปลงเป็น SQL ได้และจะได้รับการประเมินภายในเครื่องคุณอาจต้องเขียนใหม่


Entity Framework 7 (ปัจจุบันเปลี่ยนชื่อเป็นEntity Framework Core 1.0 / 2.0 ) ยังไม่รองรับGroupBy()การแปลเป็นGROUP BYใน SQL ที่สร้างขึ้น (แม้ในรุ่น 1.0 สุดท้ายจะไม่) ตรรกะการจัดกลุ่มใด ๆ จะทำงานบนฝั่งไคลเอ็นต์ซึ่งอาจทำให้โหลดข้อมูลจำนวนมากได้

ในที่สุดโค้ดที่เขียนแบบนี้จะเริ่มโดยอัตโนมัติโดยใช้ GROUP BY แต่สำหรับตอนนี้คุณต้องระมัดระวังอย่างมากหากการโหลดชุดข้อมูลที่ไม่ได้จัดกลุ่มทั้งหมดของคุณลงในหน่วยความจำจะทำให้เกิดปัญหาด้านประสิทธิภาพ

สำหรับสถานการณ์ที่เป็นตัวทำลายข้อตกลงคุณจะต้องเขียน SQL ด้วยมือและดำเนินการผ่าน EF

หากมีข้อสงสัยให้เปิด Sql Profiler และดูว่ามีอะไรสร้างขึ้นซึ่งคุณควรจะทำต่อไป

https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2


6
ขอขอบคุณที่แจ้งให้ทราบ
Jacob Stamm

4
นอกจากนี้ยังไม่มีการจัดกลุ่มใน 1.1
Simon_Weaver

5
หรือ 1.2 หรือ 2.0 ฉันยอมแพ้
Simon_Weaver

4
ประกาศวันที่ 2.1
Yush0

สิ่งนี้อาจทำให้เข้าใจผิดฉันคิดว่าการอัปเดตคำตอบของคุณเป็นสิ่งสำคัญและพูดถึงอย่างชัดเจนว่า EF เวอร์ชันก่อนหน้า EF 7 รองรับการจัดกลุ่ม คำตอบนี้ซึ่งเป็นความคิดเห็นมากกว่าคำตอบจริงสำหรับคำถาม OP นั้นทำให้เข้าใจผิดเมื่ออ่านด้วยตัวเอง (และตีความว่าเป็นคำตอบของ OP ซึ่งไม่ใช่) เมื่ออ่านสิ่งนี้อาจรู้สึกผิดได้ราวกับว่า EF 7 ไม่รองรับการจัดกลุ่มและเห็นได้ชัดว่าเวอร์ชันก่อนหน้านี้ไม่รองรับซึ่งไม่เป็นความจริง
BornToCode

14

ส่วนขยายที่มีประโยชน์คือการรวบรวมผลลัพธ์ในการDictionaryค้นหาอย่างรวดเร็ว (เช่นในลูป):

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);

พบครั้งแรกที่นี่: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c


3

นี่คือตัวอย่างง่ายๆของการจัดกลุ่มใน. 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()};

ซึ่งแปลเป็น:

SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.