有两个选项来过滤相关的实体
做一个投影。 不幸的是,当您使用Include
方法时,您无法按照您的意愿过滤相关实体。您需要将您的查询投影到DTO对象或匿名对象,如下例所示。
var query=context.Users.Include(x => x.UserRoles)
.Where(r => r.IsDeleted == IsDeleted)
.Select(u=> new{ ...,
Roles=x => x.UserRoles.Where(y=>!y.IsDeleted)})
第二个选项可以使用Explicitly Loading。但是,如果您可以加载一个特定实体的相关实体,例如。
var user=context.Users.FirstOrDefault(r.IsDeleted == IsDeleted);//Getting a user
context.Entry(user)
.Collection(b => b.UserRoles)
.Query()
.Where(y=>!y.IsDeleted)
.Load();
为此,您可以按照您第一个查询获取每个实体的foreach内,
var query=context.Users.Where(r => r.IsDeleted == IsDeleted);
foreach(var u in query)
{
context.Entry(u)
.Collection(b => b.UserRoles)
.Query()
.Where(y=>!y.IsDeleted)
.Load();
}
,但它的将是真正低效的,因为你要做一个往返到您的数据库每个实体。我的建议是使用第一个选项,投影查询。
不完全确定你想要完成什么。如果这是一个问题,你可以关闭延迟加载,或者如果这是你想要实现的,你可以加入UserRoles。 – BurnsBA