Entity Framework 中 Include() 方法的作用是什么
What's Include() method's job in Entity Framework
我有两个实体 Permission 和 Access
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 class 来过滤我数据库中的记录。
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);
}
/*...*/
}
我在我的访问服务中调用这个方法class
AccessService.cs
GenericRepository<Access> accessRepo = new GenericRepository<Access>();
List<Access> accessList = accessRepo.Get(d => d.Name == accessName, null, "PermissionList").OrderBy(d => d.Id).ToList();
此代码过滤 "Access" 类型的记录,然后在通用存储库中使用带有 "PermissionList" 参数的 Include() 方法。 Include("PermissionList") 方法的作用是什么?
它有什么作用? PermissionList 是 属性 的 Access 并且具有 Permission 类型的元素。但是我完全看不懂它的目的。
用于急切加载相关实体。
见Entity Framework Loading Related Entities。
不使用 Include() 时,此查询:
using (var context = new YourContext())
{
var access = context.Access.Single(a => a.ID == 42);
}
return 一个 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"
被急切加载,并且它似乎支持使用逗号分隔列表(例如 "PermissionList,PermissionList.ChildPermissions"
)的多个 Include()
。
我有两个实体 Permission 和 Access
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 class 来过滤我数据库中的记录。
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);
}
/*...*/
}
我在我的访问服务中调用这个方法class
AccessService.cs
GenericRepository<Access> accessRepo = new GenericRepository<Access>();
List<Access> accessList = accessRepo.Get(d => d.Name == accessName, null, "PermissionList").OrderBy(d => d.Id).ToList();
此代码过滤 "Access" 类型的记录,然后在通用存储库中使用带有 "PermissionList" 参数的 Include() 方法。 Include("PermissionList") 方法的作用是什么? 它有什么作用? PermissionList 是 属性 的 Access 并且具有 Permission 类型的元素。但是我完全看不懂它的目的。
用于急切加载相关实体。
见Entity Framework Loading Related Entities。
不使用 Include() 时,此查询:
using (var context = new YourContext())
{
var access = context.Access.Single(a => a.ID == 42);
}
return 一个 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"
被急切加载,并且它似乎支持使用逗号分隔列表(例如 "PermissionList,PermissionList.ChildPermissions"
)的多个 Include()
。