Linq - 试图过滤掉Eager Selection

时间:2017-09-26 15:16:28

标签: c# entity-framework linq linq-to-entities

我正在尝试过滤掉表格的第二部分(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();

谢谢

2 个答案:

答案 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(); 

 }

但它会变得非常低效,因为你要按照每个实体往返数据库。我的建议是使用第一个选项,投射查询。