【问题标题】:LINQ - listview - 2 levels of data in one tableLINQ - listview - 一张表中的 2 级数据
【发布时间】:2012-10-04 20:26:05
【问题描述】:

我一直在尝试解决这个问题,但我似乎无法弄清楚。我不确定是不是因为我的数据库设计和 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 个数据源。

【问题讨论】:

    标签: asp.net linq listview


    【解决方案1】:

    虽然某些数据库(如 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));
    };
    

    这应该让你得到层次结构。

    【讨论】:

      【解决方案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 的集合。一种技巧是让列表只有一层深,子项前面有间距:

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

      【讨论】:

      • 谢谢。如果我这样做,我似乎无法将它绑定到嵌套的列表视图?
      • @user1655940:我再次编辑了我的答案。希望这能回答您的问题。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-13
        • 1970-01-01
        • 2021-12-02
        相关资源
        最近更新 更多