Как интегрировать запрос CTE в Entity Framework 5

У меня есть SQL-запрос, который я написал с помощью CTE. Теперь я перемещаю репозиторий для использования Entity Framework 5.

Я не понимаю, как интегрировать (или переписать) запрос на основе CTE с помощью Entity Framework 5.

Я использую объекты POCO с EF5 и имею кучу классов Map. Нет файла EDMX и т.д.

Сейчас я чувствую себя полным нубом и буду признателен за любую помощь, которая укажет мне правильное направление.

Запрос CTE выглядит следующим образом

WITH CDE AS
(
    SELECT * FROM collaboration.Workspace AS W WHERE W.Id = @WorkspaceId
    UNION ALL
    SELECT W.* FROM collaboration.Workspace AS W INNER JOIN CDE ON W.ParentId = CDE.Id AND W.ParentId <> '00000000-0000-0000-0000-000000000000'
)
SELECT
    W.Id AS Id,
    W.Name AS Name,
    W.Description AS Description,
    MAX(WH.ActionedTimeUtc) AS LastUpdatedTimeUtc,
    WH.ActorId AS LastUpdateUserId
FROM
    collaboration.Workspace AS W
    INNER JOIN
    collaboration.WorkspaceHistory AS WH ON W.Id = WH.WorkspaceId
    INNER JOIN
    (
        SELECT TOP 10
            CDE.Id
        FROM
            CDE
            INNER JOIN
            collaboration.WorkspaceHistory AS WH ON WH.WorkspaceId = CDE.Id
        WHERE
            CDE.Id <> @WorkspaceId
        GROUP BY
            CDE.Id,
            CDE.ParentId,
            WH.ActorId,
            WH.Action
        HAVING
            WH.ActorId = @UserId
            AND
            WH.Action <> 4
        ORDER BY
            COUNT(*) DESC
    ) AS Q ON Q.Id = WH.WorkspaceId
GROUP BY
    W.Id,
    W.Name,
    W.Description,
    WH.ActorId
HAVING
    WH.ActorId = @UserId

person Umar Farooq Khawaja    schedule 06.06.2012    source источник


Ответы (2)


Вы должны создать хранимую процедуру для вашего SQL-запроса (или использовать этот запрос напрямую) и выполнить ее через dbContext.Database.SqlQuery. Вы используете подход «сначала код», когда у вас нет других вариантов. В EDMX вы можете использовать сопоставленную табличную функцию, но в первом коде такой опции пока нет.

person Ladislav Mrnka    schedule 06.06.2012
comment
Спасибо Ладислав. Это то, что я закончил делать. Я дважды задумался о создании нового объекта для возвращаемых результатов. У вас есть какие-нибудь мысли по этому поводу? - person Umar Farooq Khawaja; 06.06.2012
comment
Или для этого используются сложные типы? - person Umar Farooq Khawaja; 06.06.2012
comment
Вам не нужно сопоставлять какую-либо сущность или сложный тип. Просто создайте класс со свойствами с теми же именами, что и столбцы в вашем наборе результатов, и используйте его в качестве общего аргумента для SqlQuery. - person Ladislav Mrnka; 06.06.2012
comment
Спасибо. Это было очень полезно. - person Umar Farooq Khawaja; 06.06.2012

Я создал хранимую процедуру, которая принимает массив идентификаторов в качестве входного параметра и возвращает таблицу данных, используя рекурсивный запрос cte Взгляните на код здесь с использованием EF и первого подхода к коду

person Simple Code    schedule 21.02.2018