9

EntityFrameworkで使用する必要があるSQLServerにこのクエリがあるので、これと同じ結果になるEntityFramworkコードを作成するにはどうすればよいですか?

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

EFで変換する方法がわからないので、joinで試してみました。

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
}

しかし、結果はCTEほど再帰的ではなく、同じではありません。

4

5 に答える 5

9

EF は再帰的な CTE をサポートしていません。ビューまたはテーブル値関数を使用します。

于 2012-11-23T19:55:08.697 に答える
7

SO に関する他の専門家からの意見を得て、これを達成するための独自の方法を考え出しました。

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
                        ");
于 2012-11-23T20:20:14.440 に答える
5

Entity Framework では CTE 再帰を使用できません。

于 2012-11-23T19:54:53.920 に答える
1

ストアド プロシージャを使用し、EF を介してそのストアド プロシージャを呼び出す

于 2014-04-10T12:53:38.070 に答える