在 LINQ 中创建层次结构

本文关键字:层次结构 创建 LINQ | 更新日期: 2023-09-27 18:35:15

我有一个数据库表,它代表具有多级层次结构的帐户。每一行都有一个表示当前帐户的"帐户密钥",可能还有一个表示父帐户的"帐户密钥"的"父密钥"。

我的模型类是"AccountInfo",其中包含有关帐户本身的一些信息,以及子帐户列表。

将此平面数据库结构转换为层次结构的最简单方法是什么?可以直接在 LINQ 中完成,还是需要在事后循环并手动构建?

public class AccountInfo
{
    public int AccountKey { get; set; }
    public int? ParentKey { get; set; }
    public string AccountName { get; set; }
    public List<AccountInfo> Children { get; set; } 
}

林克

var accounts =
    from a in context.Accounts
    select new AccountInfo
        {
            AccountKey = a.AccountKey,
            AccountName = a.AccountName,
            ParentKey = a.ParentKey                            
        };

在 LINQ 中创建层次结构

您当前拥有的结构实际上是一个层次结构(邻接列表模型)。 问题是,你想保留这个分层模型吗? 如果你这样做,有一个名为MVCTreeView的Nuget包。 此包直接与您描述的表结构一起使用 - 在其中,您可以为 UI 创建树视图,在每个级别实现 CRUD 操作等。 我必须这样做,我写了一篇关于 CodeProject 的文章,展示了如何通过 C# 在 SQL 中级联删除邻接列表模型表。 如果您需要更多细节,请发表评论,我将编辑这篇文章。

http://www.codeproject.com/Tips/668199/How-to-Cascade-Delete-an-Adjace

您可以简单地为父键创建关联属性:

public class AccountInfo {
    ... // stuff you already have
    public virtual AccountInfo Parent { get; set; }
}
// in the configuration (this is using Code-first configuration)
conf.HasOptional(a => a.Parent).WithMany(p => p.Children).HasForeignKey(a => a.ParentKey);
通过此设置,可以在查询中沿任一方向遍历层次结构,也可以

通过延迟加载在查询外部遍历层次结构 如果要延迟加载子级,请确保使属性成为虚拟属性。

若要为给定父级选择所有子项,可以运行以下查询:

var children = context.Accounts
    .Where(a => a.AccountKey = someKey)
    .SelectMany(a => a.Children)
    .ToArray();