Frage Allgemeiner Tabellenausdruck in EntityFramework


Ich habe diese Abfrage in Sql Server, die ich in EntityFramework verbrauchen muss, also wie kann ich einen EntityFramwork-Code schreiben, der das gleiche Ergebnis wie dieses haben wird

WITH    cte AS
        (
        SELECT  *
        FROM    StockGroups
        WHERE   GroupParent ='Stationery' 
        UNION ALL
        SELECT  g.*
        FROM    StockGroups g
        JOIN    cte
        ON      g.GroupParent = cte.GroupName
        )
SELECT  *
FROM    cte

Ich weiß nicht, wie man es in EF konvertiert, also habe ich mit Join versucht.

from a in db.StockGroups
join b in db.StockGroups on new { GroupParent = a.GroupParent } equals new { GroupParent = b.GroupName }
where
  b.GroupName == "Stationery"
select new {
  a.GroupName,
  a.GroupParent,
  Column1 = b.GroupName,
  Column2 = b.GroupParent
}

Aber das Ergebnis ist nicht dasselbe, so rekursiv wie CTE.

Aktualisiert :


6
2017-11-23 19:52


Ursprung


Antworten:


EF unterstützt keine rekursiven CTEs. Verwenden Sie eine Ansicht oder eine Tabellenwertfunktion.


6
2017-11-23 19:55



Sie können die CTE-Rekursion nicht in Entity Framework verwenden.


4
2017-11-23 19:54



Ich habe von den anderen Experten Input über SO bekommen, ich habe meinen eigenen Weg gefunden, dies zu erreichen.

IEnumerable<StockGroup> sg = dbContext.ExecuteStoreQuery<StockGroup>(
                        @"WITH    q AS
                                    (
                                    SELECT  *
                                    FROM    LedgerGroups
                                    WHERE   GroupParent = 'Customers'
                                    UNION ALL
                                    SELECT  m.*
                                    FROM    LedgerGroups m
                                    JOIN    q
                                    ON      m.GroupParent = q.GroupName
                                    )
                            SELECT  *
                            FROM    q
                        ");

4
2017-11-23 20:20



Verwenden Sie die gespeicherte Prozedur und rufen Sie diese gespeicherte Prozedur über EF auf


0
2018-04-10 12:53



Ich denke nicht, dass es rekursive CTEs in LINQ oder in EF gibt. Die Lösung besteht darin, den CTE als Sicht darzustellen. Der Artikel über rekursive oder hierarchische Abfragen mit EF-Code zuerst und Migrationen zeigt, wie Sie eine solche Ansicht mithilfe von EF-Code-Erstmigrationen bereitstellen. Rekursive oder hierarchische Abfragen mit EF Code First und Migrationen

Originalquelle: https://stackoverflow.com/a/11929928/3850405


0
2017-09-14 14:01