2013-10-14 200 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();