实体框架递归关系分层数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架递归关系分层数据相关的知识,希望对你有一定的参考价值。

Entity Framework是否支持某种递归LINQ,还是我必须在SQL中编写查询? (使用ParentId - 典型类别子类别问题)

答案

我认为你可以通过在扩展方法中使用Include方法来解决它,只获得一个层次结构或得到它。即使它可以生成相当丑陋的SQL。

using(var context = new HierarchyContext())
{
    var depth = context
                .Categories
                .IncludeHierarchy(3, nameof(Category.Children));

    var root = depth.Single(c => c.Id == 2);
}


public static IQueryable<T> IncludeHierarchy<T>(this IQueryable<T> source, 
uint depth, string propertyName)
where T : Category
{
    var temp = source;

    for (var i = 1; i <= depth; i++)
    {
        var sb = new StringBuilder();

        for (var j = 0; j < i; j++)
        {
            if (j > 0)
            {
                sb.Append(".");
            }

            sb.Append(propertyName);
        }

        var path = sb.ToString();

        temp = temp.Include(path);
    }

    var result = temp;

    return result;
}

public class Category
{    
   // Primary key    
   public int Id { get; set; }

   // Category name    
   public string Name { get; set; }

   // Foreign key relationship to parent category    
   public int ParentId { get; set; }

   // Navigation property to parent category    
   public virtual Category Parent { get; set; }

   // Navigation property to child categories    
   public virtual ICollection<Category> Children { get; set; }    
}

以上是关于实体框架递归关系分层数据的主要内容,如果未能解决你的问题,请参考以下文章

实体框架自引用分层多对多

具有分层 Web 应用程序的实体框架

实体框架 - 分层设计 - 将连接字符串放在哪里?

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

为具有关系的分层内容选择啥数据库?

添加新实体标量时实体框架 4 映射片段错误