2013-10-14 152 views
1

我有一个数据库表,它表示具有多级层次结构的帐户。每行都有一个代表当前账户的“AccountKey”,可能还有一个代表父代的“AccountKey”的“ParentKey”。在LINQ中创建层次结构

我的模型类是“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; } 
} 

LINQ

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

所以,你有什么是SQL邻接表模型(层次通过的ParentId的方式在一个表中保持)。你想将这个表转换为不同的结构,还是保留现有的结构(带有parentId的单个表)? –

回答

1

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

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

1

你可以简单地为母密钥创建关联属性:

​​3210

有了这个设置,您可以遍历等级在任何方向在查询或通过延迟加载查询以外的任何方向,如果你想延迟加载孩子,请确保使属性为虚拟。

要选择一个给定父所有的孩子,你可能会遇到下面的查询:

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