我有以下 Entity Framework 类,其中有一列是同一个表中主键的外键:
[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())
我如何通过编写返回 bool 值的简单 LINQ 或 lambda 语句来实现这一点?
最佳答案
我写了下面的递归方法来解决这个问题:
public bool CheckIfChildItemExists(ICollection<Item> childItems, long childItemId)
{
var isChildExisting = false;
foreach (Item item in childItems)
{
if (item.Children.Contains(context.Items.Where(x => x.ItemID == childItemId && x.IsActive).FirstOrDefault()))
{
isChildExisting = true;
return isChildExisting;
}
else
{
return CheckIfItemChildExists(item.Children, childItemId);
}
}
return isChildExisting;
}
然后这样调用它:
bool isAccessible = CheckIfChildItemExists(ParentItem.Children, childItemId);
关于c# - 使用 Entity Framework 检查对象是否存在于层次结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36246910/