[英]Group data and retrieve every line of the grouping with Entity Framework
我在想,也許一旦在 C# 部分中檢索到分組數據,我就可以遍歷分組的項目列表。
var res = db.Commandes.Where(t => t.idMatiere == mod.idMatiereChoisie).GroupBy(t => t.UA_idCa);
foreach(var group in res)
{
foreach(var groupedLines in group)
{
// Always a single line, this loop is useless
}
}
似乎這里應用的邏輯更像是 SQL 而不是 C#:分組結果在一行中,你不會看到所有分組的項目。
不是我克服不了的問題
我將使用的策略是:我將只查詢所有行,而不是分組,然后在循環時,我將驗證UA_idCa
是否與之前的數據不同,這將意味着已到達下一個“組”。
但我想知道......如果可能的話,人們通常如何干凈利落地做到這一點?
您是否必須再次查詢才能檢索組的內容?
還是“我將使用的策略”更接近最佳策略?
這個問題是SQL server AND Entity Framework的組合問題。
似乎分組部分中的值之一(組內所有行的值都不同)必須標記為非空。
因為在尋找可能是鍵的內容時,實體並不關心可空值:它們可能是唯一的,也可能永遠不會為空,EF 甚至不會檢查它。
一旦在sql部分被標記為NOT NULL,EF突然明白分組部分可能有多個不同的唯一值......
所以基本上這個:
ALTER view [dbo].[Commandes] as
SELECT top(50000000)
isnull(ex.unitAdm, '000') UnitAdm
,c.id as idCahier
,isnull(ex.unitAdm, '000') + cast(c.id as nvarchar(6)) as UA_idCa
,c.NomCahier
,[Qte]
,c.prix as PrixCahier
,sc.id, 0 as idSousCahier /* THIS IS WHAT I COULD NOT COMPLETELY RETRIEVE
because it could be null ? */
,sc.NomCahier as sousCahier
,sc.prix as PrixSC
,m.id as idMatiere
,m.Code
,m.NomMatiere
,ep.id as idEpreuve
,ep.Titre
FROM [CahierExamen] cex
join Cahier c on c.id = cex.Fk_Cahier
join Examen ex on cex.FK_Examen = ex.id
join epreuve ep on ex.FK_Epreuve = ep.id
join Matiere m on ep.FK_Matiere = m.id
left join SousCahier sc on c.id = sc.FK_Cahier
order by code, unitAdm, idCahier
GO
改成這樣:
ALTER view [dbo].[Commandes] as
SELECT top(50000000)
isnull(ex.unitAdm, '000') UnitAdm
,c.id as idCahier
,isnull(ex.unitAdm, '000') + cast(c.id as nvarchar(6)) as UA_idCa
,c.NomCahier
,[Qte]
,c.prix as PrixCahier
,isnull(sc.id, 0) as idSousCahier /* WOW, NOW EF UNDERSTAND
THERE COULD BE MULTIPLE DIFFERENTS VALUES ONCE DATA ARE GROUPED*/
,sc.NomCahier as sousCahier
,sc.prix as PrixSC
,m.id as idMatiere
,m.Code
,m.NomMatiere
,ep.id as idEpreuve
,ep.Titre
FROM [CahierExamen] cex
join Cahier c on c.id = cex.Fk_Cahier
join Examen ex on cex.FK_Examen = ex.id
join epreuve ep on ex.FK_Epreuve = ep.id
join Matiere m on ep.FK_Matiere = m.id
left join SousCahier sc on c.id = sc.FK_Cahier
order by code, unitAdm, idCahier
GO
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.