【问题标题】:Put linq to sql results into hierarchical structure for using in a un-ordered list ( for jquery tree )将 linq to sql 结果放入分层结构中,以便在无序列表中使用(用于 jquery 树)
【发布时间】:2009-07-15 05:55:13
【问题描述】:

我在 L2S 类 dbml 中有 5 个表:全局 >> 类别 >> 子类别 >> 项目 >> 项目数据。我希望能够从全局表向下导航到树状结构以获取项目 - 显示项目数据表中的标题。

我有一个现有的控件,它使用 IHierarchyData / IHierarchicalEnumerable 扩展集合,通过迭代集合来输出一个无序列表,然后我用 jquery 将它变成一棵树。我是根据Return Un-Ordered List from hierarchical sql data做的

是否有一种简单的通用方法可用于将上述表结构中的数据放入分层结构中,以便我可以重用现有控件并传入不同的集合。

【问题讨论】:

    标签: c# asp.net linq-to-sql tree hierarchical-data


    【解决方案1】:

    你试过Nested Listviews吗?我已经在几页中实现了这个解决方案。我直接使用 ObjectDataSources 而不是 LinqDataSources 来保持我的数据逻辑分离,但是嵌套的 EntitySets 工作得很好。

    【讨论】:

      【解决方案2】:

      我认为困扰你的是你不需要四张桌子来做这件事。

      再看Return unordered list from hierarchical sql data。那里没有四张桌子。只有一个。

      【讨论】:

      • 是的,我为一棵树实现了该解决方案,其中我有自引用数据,就像解决方案“页面”表一样。对于我的问题,我想要另一棵树,如果我想基本上向下钻取 4 个单独的表以进入该项目。
      【解决方案3】:

      您可以使用 Union 运算符将您的四个表混合在一起。 http://weblogs.asp.net/zeeshanhirani/archive/2008/04/11/union-operator-part-12.aspx

      【讨论】:

      • @Robert:使用这个概念,我最终不会在集合中得到primaryID 和parentID 重叠的项目吗?在某些情况下,我的全局键与类别键相同,因为我的结构中的每个表都使用从 1 开始的标识种子?
      • 好吧,我们又回到了单表设计,除非您想为每个表中的主键使用 GUID。
      • 我能够为这个实例做我需要做的事情,我不喜欢代码并且它不可重复使用,我只是认为有一种方法可以获取一张有一个子集合又具有另一个子集合,并且只需使用这些集合来构建某种具有“分层”感觉的结构来填充树/嵌套列表。
      • 当您将表合并在一起时,您需要在输出中有一列告诉您正在引用哪个表,即嵌套级别。这是我能想到的唯一其他方式。
      • 您还可以在输出中添加行号以使数字唯一,请参阅stackoverflow.com/questions/365086。但是这些数字是任意的(它们不指向任何表中的记录),并且在这一点上有点绕轴。
      【解决方案4】:

      由于在这种情况下您要处理不同的类型,因此您必须在每个类型上实现一个通用接口以使代码具有通用性。基本方法是创建一个包含任何所需属性(例如 DisplayText、ActionURL 等)的接口,然后递归地遍历集合。

      这是一个粗略的例子:

       public interface IDataItem
          {
              string DisplayText { get; }
              string ActionUrl { get;  }
              bool HasChildren { get; }
              IEnumerable<IDataItem> GetChildren();
          }
      
       public void CreateTree(HtmlTextWriter writer, IEnumerable<IDataItem> collection)
          {
              writer.WriteFullBeginTag("ul");
              foreach (var data in collection)
              {
                  writer.WriteFullBeginTag("li");
                  writer.WriteBeginTag("a");
                  writer.WriteAttribute("href",data.ActionUrl);
                  writer.Write(HtmlTextWriter.TagRightChar);
                  writer.Write(data.DisplayText);
                  writer.WriteEndTag("a");
                  if(data.HasChildren)
                      CreateTree(writer, data.GetChildren());
                  writer.WriteEndTag("li");
              }
              writer.WriteEndTag("ul");
          }
      

      您必须在要包含在树视图中的每个类型上实现接口。只需传入顶级类型的集合,上面的方法将沿着层次结构向下创建所需的嵌套列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 2020-03-11
        • 2011-03-10
        • 1970-01-01
        • 2012-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多