0

私はこの問題を解決しようとしてきましたが、理解できないようです。それが私のデータベース設計と LINQ によるものかどうかはわかりませんが、ここで何らかの方向性を期待しています。

私のデータベーステーブル:

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

基本的に、Data1 と Data2 は見出しに使用するトップ レベルであり、それらの子は ParentID に基づいて関連付けられます。

リストビューを使用して、次のようなデータを表示しようとしています:

Data1
-----
   Data4
   Data5

Data2
-----
   Data6
   Data7

これを実現するために、LINQ とリストビューの組み合わせを使用しようとしています。

以下は、linq クエリのコードです。

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

しかし、これは見出しレベルのみを提供します...そして残念ながらリストビューは1つのデータソースしか取りません。

4

3 に答える 3

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));
};

これで階層が得られるはずです。

于 2012-10-04T21:47:00.567 に答える
0

自己参照テーブルからデータベースへの単一の LINQ クエリを使用してグラフを作成するソリューションについて説明したブログ投稿を書きました。http://www.thinqlinq.com/Post.aspx/Title/Hierarchical-Trees-from-Flat-Tables-using-LINQを参照してください。

于 2012-10-05T20:49:55.820 に答える
0

階層が 2 レベルしかない場合は、グループ結合と匿名オブジェクトを使用できます。

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 にバインドできるコレクションにデータを変換する必要があります。1 つのハックは、サブ項目の前に間隔を空けて 1 レベルのみの深さのリストを作成することです。

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 のように、より適したコントロールを見つけることもできます。この問題については、別の質問をすることをお勧めします。

于 2012-10-05T00:46:19.663 に答える