EntityFramework中的公用表表达式

时间:2012-11-23 19:52:18

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

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

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

您不能在Entity Framework中使用CTE递归。

答案 2 :(得分:4)

获取输入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
                        ");

答案 3 :(得分:0)

使用存储过程并通过EF

调用该存储过程

答案 4 :(得分:0)

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

原始来源: https://stackoverflow.com/a/11929928/3850405