【问题标题】:Building tree hierarchy using Linq使用 Linq 构建树层次结构
【发布时间】:2013-04-05 05:19:54
【问题描述】:

我正在使用 Linq 创建树层次结构,因为我是新手,所以我遇到了麻烦。我有两个表,我必须从中创建层次结构,表如下

A表

Id
Name
Description

表 B

Id of A (as foreign key)
Name 

我需要这样的结构:

name(From table A)
     |_name(from table B)
     |_name (from table B)
name(from table A)

我有一个类定义为

  Public Class C
   {
        public class C(C item,IEnumerable<C> id,IEnumerable<C> data)
            {

              AId=item.AI;
              BId=item.BId;
               AName=item.Name;
              Childeren=id;
            }

           public IEnumerable<C> Children{get;set}
         }

即使没有节点也必须显示所有表的名称

我使用 Group join 从两个表中获取数据,现在我遇到了选择节点及其子节点的代码问题。我的 linq 代码如下:

private List<Model> BuildHierarchy(IEnumerable<Model> Hirs)
{
    var families=Hirs.ToLookup(x => x.AId);
    var topmost = families.First().Select(s => s);
    Func<string, IList<Model>> children = null;
    children = (parentId) => families[parentId]
                    .OrderBy(x => x.BId)
                    .Select(x => new Model(x, children(x.BId), Hirs))
                    .OrderBy(o=> o.Bid).ToList();

    return topmost.Select(mod => new Model(mod, children(mod.BId), Hirs)).ToList();
}

它的作用是只获取表 A 的第一个节点,但节点所有数据。当我单击该节点时,该方法会再次被调用,创建相同的节点。

我不知道为什么我会遇到这个问题,如果你们能帮助我,这将是一个很大的帮助,因为我被困在这里很长一段时间。

谢谢

【问题讨论】:

  • 什么是Model?显示你在哪里打电话BuildHierarchy
  • 模型是保存来自数据库的数据的数据。 BuildHierarchy 在模型填充后调用,上面的代码应该创建节点及其子注释
  • 这是一个向您的帖子添加代码的调用。目前尚不清楚您如何调用BuildHierarchy 以及输出的去向。另外,您的代码中的 AB 类在哪里?
  • A 和 B 是我的代码中定义的数据库的表示形式。获取 A 和 B 的数据时调用构建层次结构,并将值返回到创建节点的类。我在迭代数据时遇到问题,因为它只返回一组数据,即数据库的第一行数据
  • 男孩!它只会变得更糟。突然出现了新的神秘课程,但仍然没有人,但你知道 ModelAB(现在是 C)是如何连接的。我放弃了。

标签: c# linq asp.net-mvc-4


【解决方案1】:

请试试这个。我会进行修改,使其更清晰或更精确。

    DataSet ds = new DataSet();

    DataTable dtPrimary = new DataTable();
    dtPrimary.Columns.Add("Id", typeof(int));
    dtPrimary.Columns.Add("Name", typeof(string));


    DataTable dtForeign = new DataTable();
    dtForeign.Columns.Add("Id", typeof(int));
    dtForeign.Columns.Add("Name",typeof(string));

    ds.Tables.Add(dtPrimary);
    ds.Tables.Add(dtForeign);
    DataRelation dr = new DataRelation("myRelation", dtPrimary.Columns["Id"], dtForeign.Columns["Id"]);

    dtPrimary.Rows.Add(1, "Name1");
    dtPrimary.Rows.Add(2, "Name2");

    dtForeign.Rows.Add(1,"Child1OfName1");
    dtForeign.Rows.Add(1, "Child2OfName1");
    dtForeign.Rows.Add(2, "ChildOfName2");

    DataTable dtNew = new DataTable();
    dtNew.Columns.Add("Id");
    dtNew.Columns.Add("Name");

var items =
    from row in dtPrimary.AsEnumerable()
    let foreignRow = (
    from innerRow in dtForeign.AsEnumerable()
    where innerRow.Field<int>("Id") == row.Field<int>("Id")
    select innerRow)
    select new { Parent = row.Field<string>("Name"), Children = foreignRow };

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2018-10-01
    • 2015-12-05
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多