EntityFramework中的公用表表达式

我在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中转换它,所以我试着加入。

 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那样递归。

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

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

通过SO获得其他专家的意见 ,我已经想出了实现这一目标的方法。

 IEnumerable sg = dbContext.ExecuteStoreQuery( @"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 "); 

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

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

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