Группируйте данные и извлекайте каждую строку группировки с Entity Framework - PullRequest
1 голос
/ 14 февраля 2020

Я думал, что, возможно, после того, как сгруппированные данные будут получены в части C#, я смогу l oop просмотреть список элементов, которые были сгруппированы.

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
    }
}

Кажется, логика c, применяемая здесь, больше похожа на SQL, чем C#: результат группировки в одну строку, и вы не увидите все сгруппированные элементы.

Это не проблема, которую я могу ' t преодолеть

Tacti c Я буду использовать : вместо группировки, я просто запросить все строки, а затем, во время цикла, я проверю, отличается ли UA_idCa сформируйте предыдущие данные, и это будет означать, что следующая «группа» была достигнута.

Но мне интересно ... Как обычно кто-то делает это чисто, если это возможно?

Вам нужно снова запросить, чтобы получить контент группы?

Или « Tacti c Я буду использовать » ближе к тому, что лучше?

1 Ответ

0 голосов
/ 14 февраля 2020

Эта проблема связана с комбинацией SQL server AND Entity Framework.

Похоже на одно из значений в сгруппированной части (значение, которое отличается для всех строка внутри группы) должна быть помечена как отличная от нуля.

Потому что при поиске того, что может быть ключом, сущность не заботится об обнуляемых значениях: они могут быть уникальными, они никогда не могут быть нулевыми EF даже не проверяет это.

Как только он помечен как NOT NULL в части sql, 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
...