我正在使用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的第一个节点,但节点所有数据。当我单击节点时,再次调用该方法创建相同的节点。
我不知道为什么我会遇到这个问题,如果你们帮助我,这将是一个很大的帮助,因为我被困在这里很长一段时间。
谢谢
答案 0 :(得分:0)
请试试这个。我会进行编辑,使其更清晰或更精确。
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 };