[asp.net-mvc]在实体框架中的 include () 方法的工作是什么

发布时间: 2017/3/25 19:38:12
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

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

Access.cs

public class Access
{
    public int Id { get; set; }

    public string Name { get; set; }

    public List<Permission> PermissionList { get; set; }
}

Permission.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 类筛选记录。

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);
            }
        /*...*/
        }

此调用在我访问服务类

AccessService.cs

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

此代码筛选记录类型的"访问",然后使用 include () 方法与通用存储库中的"PermissionList"参数。Include("PermissionList") 方法的工作是什么? 它是做什么的?PermissionList 是访问的属性和元素类型的权限。但是完全没法其目的是什么。

解决方法 1:

正是由于急切地加载相关的实体。

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

当不使用 include (),此查询︰

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

将返回 Access 实例与一个空的 PermissionList 属性。根据您的上下文如何配置的此集合将保持为空 (无延迟加载) 或会懒惰-加载尽快您访问它 ( 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() s 使用逗号分隔的列表 (例如 "PermissionList,PermissionList.ChildPermissions" )。

赞助商