gpt4 book ai didi

c# - 数据表和 LINQ 父/子关系

转载 作者:太空宇宙 更新时间:2023-11-03 21:58:40 25 4
gpt4 key购买 nike

获得了带有 Id、parentId、描述的数据表。它是一个关系表结构。

我希望能够将参数传递给函数,该函数是 TreeView 中项目的当前选定 ID。我想要一个包含所有相关子行的数据表,关系的顶部是 parentId 为 null...等等

我想做这个 LINQ

欢迎任何帮助。

enter code here var kids = ( from p in dt.AsEnumerable()
where p.Field<Int32?>( "ParentId" ) == parentId
select new
{
parent = p,
child = from c in dt.AsEnumerable()
where c.Field<Int32?>( "ParentId" ) == p.Field<Int32>( "Id" )
select new
{
child = c
}
} ).ToList();

以下是我正在使用的数据,但我无法让它按预期工作。也许我们不是在谈论相同的最终结果,或者我错过了一些可怕的事情。

这是我的代码,当我为 parentId 传递 57 的值时,我在 children 中得到 2 行。

QuotationItemId=58 和 71

我还希望获得 QuotationItemId 59, 60, 55 ,56, 61

        var lookup = dt.AsEnumerable().ToLookup( p => p.Field<int?>( "ParentId" ) );
var children = lookup[parentId].ToList();

Data dump

最佳答案

这是你可以做的:

var lookup =
dt
.AsEnumerable()
.ToLookup(p => p.Field<int?>("ParentId"));

现在,如果您想要根元素,请执行以下操作:

var roots = lookup[null];

如果你想要任何 child ,给定 parentId,你可以这样做:

var children = lookup[parentId];

很简单吧?


这是一些基于您的编辑的代码。

我使用匿名类型定义了我的项目列表:

var items = new []
{
new { QuotationItemId = 54, ParentId = (int?)null, Description = "0000", },
new { QuotationItemId = 55, ParentId = (int?)60, Description = "Product 55", },
new { QuotationItemId = 56, ParentId = (int?)60, Description = "Product 56", },
new { QuotationItemId = 57, ParentId = (int?)54, Description = "Category 57", },
new { QuotationItemId = 58, ParentId = (int?)57, Description = "Sub Category 58", },
new { QuotationItemId = 59, ParentId = (int?)58, Description = "Product 59", },
new { QuotationItemId = 60, ParentId = (int?)58, Description = "Standard Ratel", },
new { QuotationItemId = 61, ParentId = (int?)60, Description = "Product 61", },
new { QuotationItemId = 62, ParentId = (int?)null, Description = "Stage 62", },
new { QuotationItemId = 63, ParentId = (int?)62, Description = "Product 63", },
new { QuotationItemId = 64, ParentId = (int?)62, Description = "Product 64", },
new { QuotationItemId = 65, ParentId = (int?)62, Description = "Category 65", },
new { QuotationItemId = 66, ParentId = (int?)65, Description = "Sub Category66", },
new { QuotationItemId = 67, ParentId = (int?)66, Description = "Product 67", },
new { QuotationItemId = 68, ParentId = (int?)66, Description = "Standard Rate 2", },
new { QuotationItemId = 69, ParentId = (int?)68, Description = "Product 69", },
new { QuotationItemId = 71, ParentId = (int?)57, Description = "Sub Category 71", },
new { QuotationItemId = 72, ParentId = (int?)54, Description = "Category 72", },
new { QuotationItemId = 73, ParentId = (int?)72, Description = "Sub Category73", },
new { QuotationItemId = 74, ParentId = (int?)73, Description = "Product 74", },
new { QuotationItemId = 75, ParentId = (int?)73, Description = "Product 75", },
new { QuotationItemId = 77, ParentId = (int?)null, Description = "qqqqqqqqqq", },
new { QuotationItemId = 78, ParentId = (int?)null, Description = "zzzzzz", },
new { QuotationItemId = 79, ParentId = (int?)null, Description = "Test 12345", },
new { QuotationItemId = 80, ParentId = (int?)null, Description = "456", },
new { QuotationItemId = 81, ParentId = (int?)null, Description = "tttt", },
new { QuotationItemId = 82, ParentId = (int?)null, Description = "reddddy777", },
new { QuotationItemId = 83, ParentId = (int?)null, Description = "bbbbbbbbbbbb", },
new { QuotationItemId = 84, ParentId = (int?)null, Description = "nnnnnnnnnnnnn", },
};

并且,使用 LINQPad,查找工作如下:

var lookup = items.ToLookup(x => x.ParentId);

lookup[58].Dump();
lookup[60].Dump();

Screen Dump from LINQPad

你应该注意到它不会一直递归下去。

如果要一路递归,那么就需要定义一个递归函数。试试这个:

Func<IEnumerable<Quotation>, IEnumerable<Quotation>> recurse = null;
recurse = qs =>
{
return
qs
.Concat(
from q in qs
from q2 in recurse(lookup[q.QuotationItemId])
select q2);
};

recurse(lookup[57]).Dump();

这给了你:

LINQPad Image Dump

这正是我认为您所期待的。

关于c# - 数据表和 LINQ 父/子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11177074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com