我们有这样的东西
var categories = _context.Categories.Include("Categories1.Categories1.Categories1");
它可以工作并处理高达 4 级深度的子类别(这对于现在来说已经足够了,但谁知道未来呢)
有更好的方法吗?
更多信息
我们使用数据库优先。类别表包含以下列:
在这种特殊情况下,我认为递归属性可能是一个不错的选择。尝试从记忆中做到这一点(已经好几年了),性能不会很好。没有延迟加载和显式加载。
public class Category {
public int Id {get; set;}
// other stuff
public List<Category> MyChildren {
get { return _context.Categories.Where(x => x.ParentCategoryId == Id).ToList<Category>(); }
}
}
这将为您提供一个从给定节点开始的层次图。
var justOne = _context.Categories.FirstOrDefault(x => x.Id = <myval>);
缺点是您必须递归地解析/使用结果,并且结果可能呈指数增长。
澄清:EF 不允许在递归中使用 _context,其用于说明目的。在存储库/UoW 或业务层中,您可以使用相同的技术通过具有递归调用该方法的方法的属性来“组装”完成的实体。
只是为了好玩,这里有相同的递归技术(但不是作为属性,现在没有时间)。
public class Category // EF entity
{
public int Id { get; set; }
public int ParentId { get; set; }
public virtual List<Category> MyChildren { get; set; }
}
public static class MVVMCategory
{
public static Category GetCategory(int id)
{
Category result = _context.Categories.FirstOrDefault(x => x.Id == id);
result.MyChildren = GetChildren(id);
return result;
}
public static List<Category> GetChildren(int id)
{
List<Category> result = _context.Categories.Where(x => x.ParentId == id).ToList<Category>();
foreach (var item in result)
{
item.MyChildren = GetChildren(item.Id);
}
return result;
}
}
需要注意的一件事。我将 virtual 添加到延迟加载列表中,因为可以说我是“手动”加载子项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)