mon*_*nty 11 c# linq entity-framework-core asp.net-core
解释为什么这个问题不同于:EF - 多个包括急切加载分层数据.不好的做法?
在当前项目(.NET核心web api)中,我尝试从自引用表中加载层次结构.
经过谷歌搜索后,我很惊讶这样的任务(我认为这将是微不足道的)似乎并不是微不足道的.
好吧,我有这个表来形成我的层次结构:
CREATE TABLE [dbo].[Hierarchy] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Parent_Id] INT NULL,
[Name] NVARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_Hierarchy_Hierarchy] FOREIGN KEY ([Parent_Id]) REFERENCES [dbo].[Hierarchy] ([Id])
);
Run Code Online (Sandbox Code Playgroud)
在web api中,我尝试返回完整的层次结构.一个可能特别的事情(可能会有所帮助)就是我要加载完整的表格.
我也知道我可以使用预先加载和导航属性(子项为Parent和InverseParent)
_dbContext.Hierarchy.Include(h => h.InverseParent).ThenInclude(h => h.InverseParent)...
Run Code Online (Sandbox Code Playgroud)
问题是这会加载硬编码深度(例如,如果我使用1 Include()和5 ThenInclude(),则为六个级别),但我的层次结构具有灵活的深度.
任何人都可以通过给我一些代码来帮助我,如何加载整个表(例如,在1 DB调用的最佳方案中进入内存),然后使该方法返回完整的层次结构?
Iva*_*oev 22
事实上,由于所谓的EF(核心)关系修正,加载整个层次结构非常容易.
假设我们有以下型号:
public class Hierarchy
{
public int Id { get; set; }
public string Name { get; set; }
public Hierarchy Parent { get; set; }
public ICollection<Hierarchy> Children { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后是以下代码
var hierarchy = db.Hierarchy.Include(e => e.Children).ToList();
Run Code Online (Sandbox Code Playgroud)
将加载整个层次与填充正确Parent和Children性能.
当您需要加载层次结构的一部分时,引用的帖子中描述的问题就出现了,由于LINQ中缺少类似CTE的支持,这很难实现.
| 归档时间: |
|
| 查看次数: |
11771 次 |
| 最近记录: |