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