【发布时间】:2019-12-26 13:00:11
【问题描述】:
我有以下实体框架类,其中有一列是同一张表中主键的外键:
[Table("Items")]
public class Item
{
[Key]
public long ItemID { get; set; }
public string ItemName { get; set; }
public long? ItemParentID { get; set; }
[ForeignKey("ItemParentID")]
public virtual Item Parent { get; set; }
public virtual ICollection<Item> Children { get; set; }
}
上面的映射效果很好,我只需传递ItemParentID 并选择项目,就可以将Children 属性中的所有子项目设置为第n 级。
在我的业务逻辑中,我有ParentItemID 和ChildItemID,我必须检查ChildItemID 是否存在于ParentItemID 的Children 项内的层次结构中的任何位置,它可以出现在ParentItems -> Children and -> their Children and -> their Children etc 中。
我尝试了以下 lambda 表达式,但它仅适用于两个级别的子项:
ParentItem.Children.Contains(context.Items.Where(x => x.ItemID == ChildItem).FirstOrDefault())
如何通过编写返回布尔值的简单 LINQ 或 lambda 语句来实现这一点?
【问题讨论】:
-
您需要递归解析所有子子项。我通常只是创建一个静态辅助方法来执行不是 linq 的查询。 public Boolean GetChild(Item i){....}
-
@jdweng 是的,这是一种方法,但我希望在
Entity Framework本身内有一个解决方案,因为它已经能够将所有子项提升到第 n 级,而无需拧任何复杂的递归 @987654331 @语句.. -
为什么人们认为递归方法很复杂?
标签: c# entity-framework linq