【问题标题】:How to integrate a CTE query in Entity Framework 5如何在 Entity Framework 5 中集成 CTE 查询
【发布时间】:2018-02-21 16:56:56
【问题描述】:

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

我不知道如何使用 Entity Framework 5 集成(或重写)基于 CTE 的查询。

我在 EF5 中使用 POCO 实体,并且有一堆 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

【问题讨论】:

    标签: common-table-expression entity-framework-5


    【解决方案1】:

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

    【讨论】:

    • 谢谢拉迪斯拉夫。这就是我最终所做的。我对为返回的结果创建一个新实体持双重态度。你对此有什么想法吗?
    • 或者这就是复杂类型的用途?
    • 您不需要映射任何实体或复杂类型。只需创建具有与结果集中列相同名称的属性的类,并将其用作SqlQuery 的通用参数。
    • 谢谢。这很有帮助。
    【解决方案2】:

    我已经构建了一个存储过程,它以 id 数组作为输入参数并使用递归 cte 查询 Take a look at the code here it's using EF and code first approach 返回数据表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 2021-02-28
      相关资源
      最近更新 更多