如何在Entity Framework 5中集成CTE查询

Uma*_*aja 0 common-table-expression entity-framework-5

我有一个使用CTE编写的SQL查询.现在,我正在移动存储库以使用Entity Framework 5.

关于如何使用Entity Framework 5集成(或重写)基于CTE的查询,我感到很遗憾.

我正在使用EF5的POCO实体并拥有一堆Map类.没有EDMX文件等.

我现在感觉自己像一个完全的noob,并希望任何帮助指向我正确的方向.

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
Run Code Online (Sandbox Code Playgroud)

Lad*_*nka 5

您必须为SQL查询创建存储过程(或直接使用该查询)并执行它dbContext.Database.SqlQuery.您正在使用代码优先方法,您没有任何其他选项.在EDMX中,您可以使用映射表值函数,但代码优先还没有这样的选项.

  • 您不需要映射任何实体或复杂类型.只需创建具有与结果集中的列相同名称的属性的类,并将其用作`SqlQuery`的通用参数. (2认同)