2012-10-04 37 views
0

我一直在試圖解決這個問題,我似乎無法弄清楚。我不確定是否因爲我的db設計和LINQ,但我希望在這裏有一些方向。LINQ - listview - 一個表中的2級數據

我的數據庫表:

Id         Name         ParentId 
1          Data1        null 
2          Data2        null 
3          Data3        null 
4          Data4        1 
5          Data5        1 
6          Data6        2 
7          Data7        2 

基本數據1和數據2是我想要使用的標題和他們的孩子將根據他們的PARENTID有關的最高層。

我試圖用一個列表視圖呈現類似下面的數據:

Data1 
----- 
    Data4 
    Data5 

Data2 
----- 
    Data6 
    Data7 

我想使用LINQ和ListView的組合來實現這一點。

以下是LINQ查詢代碼:

var query = from data in mydb.datatable 
where data.ParentId == null 
select data; 

但這只是給出了標題級別......和不幸的ListView只需要在1個數據源。

回答

0

雖然它可能與一些數據庫(如SQL Server 2005後)編寫遞歸查詢,我不相信那些由LINQ生成。另一方面,如果記錄數量足夠小,則可以將數據實現(列表)並編寫一個使用遞歸函數的LINQ查詢來生成您的列表。

這是從內存,但它會是這個樣子:

Func<int?,IEnumerable<data>> f = null; 
f = parentId => { 
    IEnumerable<data> result = from data in mydb.datatable 
           where data.ParentId = parentId 
           select data; 
    return result.ToList().SelectMany(d=>f(d.Id)); 
}; 

這應該讓你的層次結構。

0

如果您的層次結構只有兩個水平,你可以用一組加入和匿名對象:

var query = from data in mydb.datatable.Where(x => x.ParentId == null) 
      join child in mydb.datatable.Where(x => x.ParentId != null) 
      on data.Id equals child.ParentId into children 
      select new { data, children }; 

編輯:您必須將數據轉換爲可以綁定到ListView的集合。一個黑客將有一個列表,只有一級深有間距的子項的面前:

var listViewItems = (from item in query.AsEnumerable() 
        let dataName = item.data.Name 
        let childNames = item.children.Select(c => " " + c.Name) 
        from name in dataName.Concat(childNames) 
        select new ListViewItem(name)).ToArray(); 

您也可以嘗試找到適合更好,就像一個TreeView控件。你可能想問一個關於這個問題的單獨問題。

+0

謝謝。看來如果我這樣做,我將無法將它綁定到一個嵌套的列表視圖? – user1655940

+0

@ user1655940:我再次編輯了我的答案。希望這可以回答你的問題。 –