使用LINQ填充父级-子级的最佳方法

zazmityj  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(133)

我正在尝试使用LINQ填充Parent和Children,我的代码如下所示:

var ds = myDAL.GetDataSet("mySP");
var Parent = ds.Tables[0];
var Children = ds.Tables[1];

var ParentChildren = from p in Parent.AsEnumerable()
                     select new 
                   { 
                     Id = p.Field<int>("Id"), 
                     Name = p.Field<string>("Name"), 
                     Children = 
                       ( from c in Children.AsEnumerable() 
                         where c.Field<int>("ParentId") = p.Field<int>("Id")
                         select new 
                         {
                            Id = c.Field<int>("Id"), 
                            Name = c.Field<string>("Name")
                         } 
                       )
                    };

我担心性能问题,因为我假设它会一次又一次地运行嵌套查询,所以如果我有1000个父项,嵌套查询会运行1000次吗?

oo7oh9g9

oo7oh9g91#

首先使用ToLookup按父ID对子项进行分组是明智的。这是一个O(n log n)操作,在该集合中进行查找也是一个O(1)操作,因此可以避免当前查询的O(n²)复杂性行为。

var ds = myDAL.GetDataSet("mySP");
var Parent = ds.Tables[0];
var Children = ds.Tables[1];
var ChildrenByParentID = Children.AsEnumerable().ToLookup(
    c => c.Field<int>("ParentId")
    c => new 
         {
             Id = c.Field<int>("Id"), 
             Name = c.Field<string>("Name")
         });

var ParentChildren = from p in Parent.AsEnumerable()
                     select new 
                     { 
                       Id = p.Field<int>("Id"), 
                       Name = p.Field<string>("Name"), 
                       Children = ChildrenByParentID[p.Field<int>("Id")]
                     };

相关问题