Выражение общей таблицы в EntityFramework

У меня есть этот запрос на Sql Server, который мне нужно потреблять в EntityFramework. Итак, как я могу написать код 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.

Обновлено:

IEnumerable<StockGroup> sg = dbContext.ExecuteStoreQuery<StockGroup>(@"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.

+5
23 нояб. '12 в 19:52
источник поделиться
5 ответов

EF не поддерживает рекурсивные CTE. Используйте функцию представления или таблицы.

+6
23 нояб. '12 в 19:55
источник

Получив информацию от других экспертов по поводу 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
                        ");
+4
23 нояб. '12 в 20:20
источник

Связанные вопросы


Похожие вопросы

Вы не можете использовать рекурсию CTE в Entity Framework.

+4
23 нояб. '12 в 19:54
источник

Я не думаю, что есть поддержка рекурсивных CTE в LINQ или EF. Решение состоит в том, чтобы показать CTE как представление. Статья о рекурсивных или иерархических запросах с использованием EF Code First и Migrations показывает, как развернуть такое представление, используя первые миграции EF-кода. Рекурсивные или иерархические запросы с использованием EF Code First и Migrations

Исходный источник: qaru.site/questions/68033/...

0
14 сент. '17 в 14:01
источник

Используйте хранимую процедуру и вызовите эту хранимую процедуру через EF

0
10 апр. '14 в 12:53
источник

Посмотрите другие вопросы по меткам или Задайте вопрос