我有一张这样的桌子
public class Asset
{
public int id_asset { get; set; }
public int id_user { get; set; }
public int id_parent_asset { get; set; }
public string name { get; set; }
public virtual Asset Parent_Asset { get; set; }
public virtual ICollection<Asset> Child_Assets { get; set; }
public virtual User User { get; set; }
}
我想获得资产的所有子资产。我尝试了以下代码,
context.Asset.Where(o => o.name.Contains("Root")).Include(o => o.Child_Assets ).FirstOrDefault();
但是它仅包含一级子级。我需要获得所有级别。我不知道我应该获得多少个级别,所以我需要一个递归方法,或者也许已经有一个方法可以做到这一点。
有谁知道我该如何处理这个问题。
答案 0 :(得分:1)
我遇到了同样的问题,并且能够使用延迟加载而不是急切加载来解决。那可能不适合您。
使用延迟加载,您无需指定在查询数据库时要加载的导航属性(无需.include调用)。 EF Core会在您访问相关实体时自动为其加载它们。也就是说,从上下文中获取根资产,它的子代将在那里。
要使用延迟加载,您需要添加Microsoft.EntityFrameworkCore.Proxies nuget程序包,然后在配置上下文时调用.UseLazyLoadingProxies()
。有关详细信息,请参见文档https://docs.microsoft.com/en-us/ef/core/querying/related-data#lazy-loading
还请注意,要使魔术发生,加载实体的上下文需要了解相关实体(在您的情况下为子资产)。它将不会在数据库中查询子资产,但是如果它在内存中有它们将会链接它们。因此,在您的情况下,您将需要加载所有资产,然后获得根资产及其子代及其子代。
如果您使用多个上下文,则可能会遇到问题。假设资产被加载到一个上下文中,而用户被加载到另一个上下文中,在这种情况下为root。User将为null,因为用于加载根资产的上下文没有用户在内存中。