【问题标题】:Common Table Expression in EntityFrameworkEntityFramework 中的公用表表达式
【发布时间】:2012-11-12 04:02:03
【问题描述】:

我在 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 一样递归。

【问题讨论】:

    标签: c# .net linq entity-framework-4 common-table-expression


    【解决方案1】:

    EF 不支持递归 CTE。使用视图或表值函数。

    【讨论】:

    • 它不是实体框架。但是当 EF 不能做一些你可以用 sql 查询做的事情时,它是正确的。
    【解决方案2】:

    得到输入from the other experts over 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
                            ");
    

    【讨论】:

    • 如果要执行原始 SQL,为什么还要使用 EF? IMO 这是相当脆弱的。我建议将此查询转换为视图并将所述视图添加到您的 EF 模型中。
    • @SouthShoreAK 如果'Customer' 成为参数,则无法将其转换为视图。
    • @SouthShoreAK 因为许多编码人员更喜欢仅在应用程序中进行代码版本控制。维护视图增加了更多的复杂性。这应该存储在资源字符串中。这个答案仍然显示映射到一个比 SqlDataReader 更方便、更容易的类。
    【解决方案3】:

    您不能在实体框架中使用 CTE 递归。

    【讨论】:

      【解决方案4】:

      使用存储过程并通过 EF 调用该存储过程

      【讨论】:

        【解决方案5】:

        我认为 LINQ 和 EF 都不支持递归 CTE。解决方案是将 CTE 公开为视图。有关使用 EF 代码优先和迁移的递归或分层查询的文章展示了如何使用 EF 代码优先迁移部署此类视图。 Recursive or hierarchical queries using EF Code First and Migrations

        原文出处: https://stackoverflow.com/a/11929928/3850405

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多