我有以下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; }
}
上面的映射效果很好,只需传递Children
并选择项目,我就可以将ItemParentID
属性中的所有子项都放到第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语句来实现这一点?
答案 0 :(得分:0)
我写了以下递归方法来解决这个问题:
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);
答案 1 :(得分:0)
无论对象是什么以及数据库中的表是什么,您唯一需要拥有的就是对象的主键。
var dbValue = EntityObject.Entry(obj).GetDatabaseValues();
if (dbValue != null)
{
exist
}