gpt4 book ai didi

c# - LINQ:链 ID 从一行到另一行

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

我有一张 table ,里面设置了一个 child -> child -> parent 。 (这是我在现有旧数据库上使用的补丁,所以有点不可靠)。

表的类:

public class Foo
{
int ID {get;set;}
int ParentID {get;set;}
int BaseParentID {get;set;}
}

假设我在那里有一些记录

ID: 10, ParentID: 5, BaseParentID: 5
ID: 05, ParentID: 1, BaseParentID: 5
ID: 01, ParentID: 1, BaseParentID: 0

我想做的是获取每个 ParentID,直到 baseparentid 为 0。所以在某种程度上,它是从一条记录到另一条记录遍历表并将其检索到 ID 列表中。

最终结果应该是一个列表:{ 10, 5, 1 }

这就是我现在正在做的(目前有 4 个的限制,但如果没有限制我会更喜欢它):

var list = new List<int?>();
var id = 10; // The first ID is given when this method is started.
list.Add(id);
int? pid = db.Foo.Where(w => w.ID == id).Single().BaseParentID; // i have this as a compiled query function
if (pid != 0) {
list.Add(pid);
pid = db.Foo.Where(w => w.ID == pid).Single().BaseParentID; // for the sake of this example i'm just using the query here
if (pid != null) {
list.Add(pid);
// And so on
}
}

如您所见,这样做有点糟糕。但我不确定是否有办法在花哨的 linq 查询中执行此操作。

附言。这一点是一种伪文件夹结构。

最佳答案

这是一个很好的例子,你可以在这里写一个单独的 iterator function :

 IEnumerable<Foo> TraverseParents(Foo foo, IEnumerable<Foo> all)
{
while(foo != null)
{
yield return foo;
foo = (foo.pid == 0) ? null : all.FirstOrDefault(f => f.ID == foo.pid);
}
}

// In the calling code
var id = 10;
Foo root = db.Foo.FirstOrDefault(f => f.ID == id);
List<int> list = TraverseParents(root, db.Foo)
.Select(f => f.ID)
.ToList();

关于c# - LINQ:链 ID 从一行到另一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7290997/

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