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

标签 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; }
}

上面的映射效果很好,我只需传递 ItemParentID 并选择项目,就可以将 Children 属性中的所有子项目提升到第 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 语句来实现这一点?

最佳答案

我写了下面的递归方法来解决这个问题:

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/

相关文章:

asp.net-mvc - 使用 Entity Framework 实现存储库模式。存储库范围内的问题解决实体

entity-framework - 如何在Silverlight MVVM中从ViewModel关闭ChildWindow?

c# - 如何编写此 LINQ 以应用业务逻辑?

c# - 我该如何解决这个 "System.Data.Entity.DynamicProxies"错误

c# - 如何确保 List<String> 只包含序列中的每个字符串一次

c# - 如何以相对 url 格式获取 Sharepoint 图像

c# - 并行扩展

C#线程创建问题

c# - 了解 MVC 5 用户声明表

c# - 如何取消绑定(bind)源中的所有更改?