ฉันต้องการแปลSQL
คำสั่งนี้เป็นLinq-Entity
แบบสอบถาม ...
SELECT name, count(name) FROM people
GROUP by name
ฉันต้องการแปลSQL
คำสั่งนี้เป็นLinq-Entity
แบบสอบถาม ...
SELECT name, count(name) FROM people
GROUP by name
คำตอบ:
ไวยากรณ์การสืบค้น
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() });
แต่ระวังข้อความในคอนโซล / บันทึกเสมอ หากคุณเห็นการแจ้งเตือนว่าแบบสอบถามของคุณไม่สามารถแปลงเป็น 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
ส่วนขยายที่มีประโยชน์คือการรวบรวมผลลัพธ์ในการ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
นี่คือตัวอย่างง่ายๆของการจัดกลุ่มใน. 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]
ด้วย EF 6.2 มันใช้ได้ผลสำหรับฉัน
var query = context.People
.GroupBy(p => new {p.name})
.Select(g => new { name = g.Key.name, count = g.Count() });