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 和 listview 的组合来完成此操作。

以下是 linq 查询的代码:

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

但这只会给出标题级别......不幸的是,listview 只接受 1 个数据源。

4

3 回答 3

0

我刚刚写了一篇博客文章,描述了一种解决方案,该解决方案通过单个 LINQ 查询从自引用表构建图形到可能有用的数据库。请参阅http://www.thinqlinq.com/Post.aspx/Title/Hierarchical-Trees-from-Flat-Tables-using-LINQ

于 2012-10-05T20:49:55.820 回答
0

虽然某些数据库(如 2005 年后的 SQL Server)可以编写递归查询,但我不相信这些是由 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

如果您的层次结构只有两个级别,您可以使用组加入和匿名对象:

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。您可能想就这个问题提出一个单独的问题。

于 2012-10-05T00:46:19.663 回答