簡體   English   中英

使用實體框架對數據進行分組並檢索分組的每一行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM