我有一个自引用表,我需要将日期从表绑定到树视图。亲子。我的问题是如何使用匿名类型
使用实体框架从该表获取树视图有些像这样:
var tree = db.Categories.Select(g => new
{
id = g.CategoryId,
text = g.CategoryName,
children = g.children.Select(w => new
{
id = w.CategoryId,
parent = w.ParentCategoryId,
text = w.CategoryName,
}).ToList(),
}
).ToList();
以下是代码:
public partial class Category
{
public Category()
{
this.children = new HashSet<Category>();
}
public int CategoryId { get; set; }
public string CategoryName { get; set; }
public Nullable<int> ParentCategoryId { get; set; }
public virtual ICollection<Category> children { get; set; }
public virtual Category Parent { get; set; }
}
答案 0 :(得分:0)
我想为你的目的创建一个类型,而不是通过递归方法使用匿名类型和填充模型。
var three = BuildThree(db.Categories);
public IEnumerable<CategoryVm> BuildThree(IEnumerable<Categories> categories, int? parentCategoryId = null)
{
if (categories == null)
return null;
var result = categories.select(c => new CategoryVm()
{
id = c.CategoryId,
text = c.CategoryName,
parent = parentCategoryId,
children = BuildThree(c.children, c.CategoryId)
}
return result;
}
此解决方案存在缺陷 - 每次调用导航属性(子级)时,您都会向数据库发出请求。如果你想在一个请求中创建它并且你只有一个级别的嵌套类别,那么.Include(c => c.Children)
就足够了,否则你必须选择下一个选项之一:
编写公用表表达式(CTE)查询,将其放入查看或存储过程并通过EF映射。 EF的作用并不是很大,因为最棘手的部分是SQL查询
特别是出于这种目的,Microsoft SQL Server有hierarchyid
但EF不支持它。但是有一些解决方法:Entity Framework HierarchyId Workarounds
您可以向rootId
实体添加类似Comment
的内容,此时每个子播放都会有一个指向根评论的链接。之后,您可以在一个SQL查询中将所有层次结构加载到内存并手动映射。鉴于数据库是瓶颈,它将比为每个层次结构进行新查询快得多。