使用Entity Framework检查层次结构中是否存在对象

时间:2016-03-27 11:44:20

标签: c# entity-framework linq

我有以下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级。

在我的业务逻辑中,我有ParentItemIDChildItemID,我必须检查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语句来实现这一点?

2 个答案:

答案 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)

最佳方法

无论对象是什么以及数据库中的表是什么,您唯一需要拥有的就是对象的主键。

C#代码

var dbValue = EntityObject.Entry(obj).GetDatabaseValues();
if (dbValue != null)
{
   exist
}