相关疑难解决方法(0)

Entity Framework如何使用递归层次结构?Include()似乎无法使用它

我有一个Item.Item有一个Category.

CategoryID,Name,ParentChildren.ParentChildrenCategory太.

当我为特定的LINQ to Entities查询时Item,它不返回相关的Category,除非我使用该Include("Category")方法.但它并没有带来父母和孩子的完整范畴.我能做到Include("Category.Parent"),但这个对象就像一棵树,我有一个递归的层次结构,我不知道它的结束.

如何让EF完全加载Category父项和子项,父项与父项和子项一起加载,依此类推?

这不适用于整个应用程序,出于性能考虑,仅需要此特定实体(类别).

c# entity-framework visual-studio-2008

69
推荐指数
5
解决办法
6万
查看次数

递归层次结构 - 使用Linq的递归查询

我正在使用实体框架(版本6)映射到递归层次结构,它很好地映射.

我的问题是我想以递归方式获取层次结构中特定节点的所有子节点.

我使用Linq很容易得到子节点:

var recursiveList = db.ProcessHierarchyItems
            .Where(x => x.id == id)
            .SelectMany(x => x.Children);
Run Code Online (Sandbox Code Playgroud)

有人知道一个干净的实现,会递归地让所有孩子?

c# linq recursion entity-framework

24
推荐指数
2
解决办法
4万
查看次数

CTE获取父母的所有孩子(后代)

我有这个让我头疼的问题......

说,我有一个包含数千行的表,表的结构包含父 - >子关系.

这种关系可以达到6个级别.这是表结构的示例:

ProductId | ParentId | Levels
1174           0        1174
311           1174      311, 1174
1186          311       1186, 311, 1174
448           1186      448, 1186, 311, 1174
3365          448       3365, 448, 1186, 311, 1174
Run Code Online (Sandbox Code Playgroud)

我们有一个循环遍历整个表以获取关系并保存"级别"列的进程,这个过程非常慢(因为循环)并且我尝试了一些cte来获得关系,但是很难实现.

到目前为止,我已经尝试过这个cte,但它没有做我希望的事情,而且,它似乎在复制行...

;With Parents(ProductId, ParentId, Levels)
As(
  Select ProductId, ParentId, Levels
  From Products
  Where ParentId = 0 
  Union All
  Select p.ProductId, p.ParentId, p.Levels
  From Products p
  Join Parents cte On cte.ProductId = p.ParentId
)
Select *
From Parents
Run Code Online (Sandbox Code Playgroud)

正如我之前提到的,我们有一个循环表的过程,它完成它的工作,但它可能需要长达30分钟,我的问题是有更好的方法来做到这一点?我知道CTE允许我这样做,但我很糟糕,同样,应该在桌面上计算和更新关卡列,是否可能?

这是一个Sqlfiddle以防有人可以提供帮助,谢谢!

sql-server common-table-expression

12
推荐指数
1
解决办法
4万
查看次数

EFCore 中的 CTE(公用表表达式)

我的数据库中有一个表,用于存储位置的层次结构。它有 3 列(Id, Name, ParentId)。我需要根据条件加载一些行以及它们的所有父行直到根。如果是在 ADO 中,我会使用以下语句。

with Temp
as
(
    select * from Locations where Name like '%filter%'

    union all

    select Locations.* 
    from Temp join Locations on Temp.ParentId = Locations.Id
)
select * from Temp
Run Code Online (Sandbox Code Playgroud)

我正在使用 EFCore,并通过一些搜索发现实体框架如何与递归层次结构一起工作?Include() 似乎不适用于它 如何使用实体框架进行递归加载?还有一堆其他的,他们都老了。

我发现的所有解决方案要么对层次结构的深度进行硬编码(使用Include),要么在 C# 中进行递归。所有这些,我的问题是最好的解决方案是什么?

我可以使用FromSqlRaw (类似下面的代码),但是我不喜欢在 C# 中手动编写查询。

    var locations = DataContext.Locations
    .FromSqlRaw("MyQuery").ToList();
Run Code Online (Sandbox Code Playgroud)

我在用EFCore 3.1.7

sql-server recursion hierarchy sql-cte entity-framework-core

10
推荐指数
1
解决办法
5044
查看次数