实体框架自引用 - 父子

时间:2017-01-14 15:20:47

标签: c# sql-server entity-framework

我有一个自引用表,我需要将日期从表绑定到树视图。亲子。我的问题是如何使用匿名类型

使用实体框架从该表获取树视图

有些像这样:

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

1 个答案:

答案 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)就足够了,否则你必须选择下一个选项之一:

  1. 编写公用表表达式(CTE)查询,将其放入查看或存储过程并通过EF映射。 EF的作用并不是很大,因为最棘手的部分是SQL查询

  2. 特别是出于这种目的,Microsoft SQL Server有hierarchyid但EF不支持它。但是有一些解决方法:Entity Framework HierarchyId Workarounds

  3. 您可以向rootId实体添加类似Comment的内容,此时每个子播放都会有一个指向根评论的链接。之后,您可以在一个SQL查询中将所有层次结构加载到内存并手动映射。鉴于数据库是瓶颈,它将比为每个层次结构进行新查询快得多。