使用 include Entity Framework core 3.1 时如何过滤嵌套对象
How to filter nested object when using include Entity Framework core 3.1
我有一个 user table,其中包含一个嵌套的 table,在此 [=33] 中名为 UserPriviliges =] 我有 isDeleted 字段来识别已删除的数据而不实际删除它,我想使用 include
检索具有其权限的用户
public async Task<User> GetUser(Guid userId)
{
return await RepositoryContext.Users
.Include(x => x.UserPrivileges).ThenInclude(x => x.Privilege)
.FirstOrDefaultAsync(x => x.Id == userId);
}
如何过滤 UserPriviliges 以仅带来带有 false isDeleted 属性
的项目
在 EF Core <3.0 中我可以这样做
return await RepositoryContext.Users
.Include(x => x.UserPrivileges.Where(y=>y.IsDeleted)).ThenInclude(x => x.Privilege)
.FirstOrDefaultAsync(x => x.Id == userId);
但它在 EF Core 3.1 中不再工作 returns
Lambda expression used inside Include is not valid
一个选项是:
public async Task<User> GetUser(Guid userId)
{
return await RepositoryContext.Users
.Include(x => x.UserPrivileges).ThenInclude(x => x.Privilege)
.Where(x => x.UserPrivileges.Any(p => p.IsDeleted))
.FirstOrDefaultAsync(x => x.Id == userId);
}
但这将 return 具有所有 UserPrivileges 的用户(意味着 returned 用户对象将同时包含 IsDeleted 和 !IsDeleted UserPrivileges)。
如果您在 UserPrivileges 中有用户引用,那么另一个选项是从 UserPrivileges 导航,如下所示:
RepositoryContext.UserPrivileges
.Include(x => x.User)
.Where(x => x.IsDeleted && x.User.Id == userId)
我根本不记得这在 EF Core 中有效;通常我们会将其分成两个查询:1- 获取用户数据,2- 获取过滤后的用户权限
var user = await RepositoryContext.Users
.FirstOrDefaultAsync(u => u.Id == userId);
await RepositoryContext.UserPrivileges
.Where(up => up.UserId == userId && !up.IsDeleted)
.Include(up => up.Privilege)
.ToListAsync();
return user;
当我们将相关数据放入第二个查询的上下文中时,ef 将负责填充 user.UserPrivileges,因此我们根本不需要分配它。如果我们获取多个用户数据,这很有效。
我有一个 user table,其中包含一个嵌套的 table,在此 [=33] 中名为 UserPriviliges =] 我有 isDeleted 字段来识别已删除的数据而不实际删除它,我想使用 include
检索具有其权限的用户 public async Task<User> GetUser(Guid userId)
{
return await RepositoryContext.Users
.Include(x => x.UserPrivileges).ThenInclude(x => x.Privilege)
.FirstOrDefaultAsync(x => x.Id == userId);
}
如何过滤 UserPriviliges 以仅带来带有 false isDeleted 属性
的项目在 EF Core <3.0 中我可以这样做
return await RepositoryContext.Users
.Include(x => x.UserPrivileges.Where(y=>y.IsDeleted)).ThenInclude(x => x.Privilege)
.FirstOrDefaultAsync(x => x.Id == userId);
但它在 EF Core 3.1 中不再工作 returns
Lambda expression used inside Include is not valid
一个选项是:
public async Task<User> GetUser(Guid userId)
{
return await RepositoryContext.Users
.Include(x => x.UserPrivileges).ThenInclude(x => x.Privilege)
.Where(x => x.UserPrivileges.Any(p => p.IsDeleted))
.FirstOrDefaultAsync(x => x.Id == userId);
}
但这将 return 具有所有 UserPrivileges 的用户(意味着 returned 用户对象将同时包含 IsDeleted 和 !IsDeleted UserPrivileges)。
如果您在 UserPrivileges 中有用户引用,那么另一个选项是从 UserPrivileges 导航,如下所示:
RepositoryContext.UserPrivileges
.Include(x => x.User)
.Where(x => x.IsDeleted && x.User.Id == userId)
我根本不记得这在 EF Core 中有效;通常我们会将其分成两个查询:1- 获取用户数据,2- 获取过滤后的用户权限
var user = await RepositoryContext.Users
.FirstOrDefaultAsync(u => u.Id == userId);
await RepositoryContext.UserPrivileges
.Where(up => up.UserId == userId && !up.IsDeleted)
.Include(up => up.Privilege)
.ToListAsync();
return user;
当我们将相关数据放入第二个查询的上下文中时,ef 将负责填充 user.UserPrivileges,因此我们根本不需要分配它。如果我们获取多个用户数据,这很有效。