我正在使用Code First的Entity Framework 6,我有一个具有以下结构的表:
public class Item
{
[Key]
public int ItemId { get; set; }
[Required]
[MaxLength(255)]
public string Name { get; set; }}
public Item Parent { get; set; }
public virtual List<Item> Children { get; set; }
}
我想知道是否有可能在数据库中进行单个查询/旅行,在我的树中全部Items
直到根,提供itemId
作为参数。< / p>
例如,在ItemId
55之前给我所有父母,直到找不到父母。
答案 0 :(得分:0)
你无法使用任何合理的代码在一次旅行中获得所有父母。
但是你可以这样做:https://stackoverflow.com/a/11565855/304832
通过稍微修改您的实体,您可以添加2个派生集合:
public class Item
{
[Key]
public int ItemId { get; set; }
[Required]
[MaxLength(255)]
public string Name { get; set; }}
public virtual Item Parent { get; set; } // be sure to make this virtual
public virtual List<Item> Children { get; set; }
public virtual ICollection<ItemNode> Ancestors { get; set; }
public virtual ICollection<ItemNode> Offspring { get; set; }
}
你确实需要引入一个新的实体来实现这个目的,如下所示:
public class ItemNode
{
public int AncestorId { get; set; }
public virtual Item Ancestor { get; set; }
public int OffspringId { get; set; }
public virtual Item Offspring { get; set; }
public int Separation { get; set; } // optional
}
现在,如果你想要
来自ItemId 55的所有父母,直到找不到父母
......你可以这样做:
IEnumerable<Item> allParentsFrom55 = dbContext.Set<Item>()
.Find(55).Ancestors.Select(x => x.Ancestor);