2017-09-26 72 views
1

我想过滤掉表(UserRoles.IsDeleted == false)的第二部分。有什么建议我怎么能做到这一点?Linq - 试图过滤出渴望的选择

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

不完全确定你想要完成什么。如果这是一个问题,你可以关闭延迟加载,或者如果这是你想要实现的,你可以加入UserRoles。 – BurnsBA

回答

0

您可以执行以下操作使用第二部分进行过滤:

var Users = context.Users.Where(r => r.IsDeleted == IsDeleted).ToList<User>(); 

if(condition) 
{ 
    Users = Users.where(y => y.IsDeleted == false)).ToList(); 
} 
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(); 

} 

,但它的将是真正低效的,因为你要做一个往返到您的数据库每个实体。我的建议是使用第一个选项,投影查询。