我正在尝试过滤掉表格的第二部分(UserRoles.IsDeleted == false)。有什么建议我能做到吗?
var Users = context.Users.Where(r => r.IsDeleted == IsDeleted).ToList<User>();
Users = context.Users.Include(x => x.UserRoles.Select(y=>y.IsDeleted==false)).ToList();
谢谢
答案 0 :(得分:0)
您可以使用第二部分进行以下过滤:
var Users = context.Users.Where(r => r.IsDeleted == IsDeleted).ToList<User>();
if(condition)
{
Users = Users.where(y => y.IsDeleted == false)).ToList();
}
答案 1 :(得分:0)
有两种方法可以过滤相关实体
进行投射。
不幸的是,当您使用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();
}
但它会变得非常低效,因为你要按照每个实体往返数据库。我的建议是使用第一个选项,投射查询。