什么是 Include() 方法在实体框架中的工作

本文关键字:框架 实体 工作 方法 Include 什么 | 更新日期: 2023-09-27 18:37:12

我有两个实体权限和访问权限

访问.cs

public class Access
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Permission> PermissionList { get; set; }
}

许可.cs

public class Permission
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int ParentId { get; set; }
    [NotMapped]
    public bool HasChildren { get; set; }
    [NotMapped]
    public List<Permission> ChildPermissions { get; set; }
}

我还有 GenericRepository 类来过滤数据库中的记录。

通用存储库.cs

 public virtual IEnumerable<TEntity> Get(
            Expression<Func<TEntity, bool>> filter = null,
            Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
            string includeProperties = "", bool tracking = true)
        {
            IQueryable<TEntity> query = dbSet;

            if (filter != null)
            {
                query = query.Where(filter);
            }
            foreach (var includeProperty in includeProperties.Split
                (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
            {
                query = query.Include(includeProperty);
            }
        /*...*/
        }

我在访问服务类中调用此方法

访问服务.cs

GenericRepository<Access> accessRepo = new GenericRepository<Access>();
List<Access> accessList = accessRepo.Get(d => d.Name == accessName, null, "PermissionList").OrderBy(d => d.Id).ToList();

此代码筛选"访问"的记录类型,然后在通用存储库中使用带有"权限列表"参数的 Include() 方法。什么是包含("权限列表")方法的工作?它有什么作用?权限列表是 Access 的属性,其元素类型为"权限"。但我不能完全明白它的目的是什么。

什么是 Include() 方法在实体框架中的工作

它用于急切地加载相关实体。

请参阅实体框架加载相关实体。

不使用 Include() 时,此查询:

using (var context = new YourContext())
{
    var access = context.Access.Single(a => a.ID == 42);    
}

将返回具有空 PermissionList 属性的Access实例。根据上下文的配置方式,此集合将保持为空(无延迟加载)或在您访问它后立即延迟加载 (foreach (var permission in access.PermissionList) { ... } )。

现在有了Include()

using (var context = new YourContext())
{
    var access = context.Access.Include(a => a.PermissionList)
                               .Single(a => a.ID == 42);    
}

查询将作为联接编写,为您加载所有相关权限。

Include()扩展方法还具有字符串重载,存储库代码正在调用该重载:

query = query.Include(includeProperty);

这会导致在您的情况下急切地加载"PermissionList",并且它似乎支持使用逗号分隔列表的多个Include()(例如 "PermissionList,PermissionList.ChildPermissions" )。