从子 ID LINQ 中选择项的父项

Selecting the Parents of item from Child ID LINQ

提问人:beeeeeeeeeen 提问时间:6/14/2023 最后编辑:Mark Schultheissbeeeeeeeeeen 更新时间:6/14/2023 访问量:44

问:

类型等级:

public partial class URS_Types
{
    [Key]
    public int ID { get; set; }

    public string TypeName { get; set; }

    public int? ParentID { get; set; }
}

我正在尝试创建一个子方法,该子方法将接收请求“类型”的 ID,然后它将获得它的父级(使用 parentID),然后获取它的父级,直到没有其他类别。

我已经尝试了以下方法,但显然由于选择命令,这仅返回第一种类型,但不确定如何告诉它选择所有类型。

var types = GetURS_Types();

var test = from type in types
           where type.ID == id
           join type2 in types
           on type.ParentID equals type2.ID
           join type3 in types
           on type2.ParentID equals type3.ID
           select type.TypeName;
C# LINQ

评论

1赞 Hunter Tran 6/14/2023
Parent 是同一个班级吗?
0赞 beeeeeeeeeen 6/14/2023
@HunterTran 是
1赞 Hunter Tran 6/14/2023
您可以修改类或使其成为树结构吗?URS_Types
0赞 Mark Schultheiss 6/15/2023
这可能有助于您完成此 stackoverflow.com/q/7062882/125981

答:

0赞 Nathan 6/14/2023 #1

假设您有一个对象URS_Types列表,其中 ParentID = 0 的对象是真正的父元素。

URS_Types parentParent = new URS_Types();
parentParent.ID = 1;
parentParent.ParentID = 0;
parentParent.TypeName= "parentParent";

URS_Types parent = new URS_Types();
parent.ID = 2;
parent.ParentID = 1;
parent.TypeName = "parent";

URS_Types child = new URS_Types();
child.ID = 3;
child.ParentID = 2;
child.TypeName = "child";

URS_Types noParentType = new URS_Types();
noParentType.ID = 4;
noParentType.ParentID = 0;
noParentType.TypeName = "No parent";

List<URS_Types> listType = new List<URS_Types>();
listType.Add(parentParent);
listType.Add(parent);
listType.Add(child);
listType.Add(noParentType);
listType = listType.OrderBy(a => rng.Next()).ToList();

它返回函数,ID 为 3(表示它是子对象)。我们可以做一个小的 while 循环来检索这个对象的真正父级。GetURS_Types()

var childId = GetURS_Types(child); // will return an int: 3
int trueParent = childId; 
URS_Types theTrueParent;
while (trueParent > 0)
{
    theTrueParent = listType.First(x => x.ID == trueParent);
    trueParent = listType.First(x => x.ID == trueParent).ParentID;
}

注意:我们永远不会得到对象 noParentType(除非我们要求它的 ID),因为我们在 ParentID 属性之后的列表中工作。GetURS_Types()