Linq按语法选择分组

时间:2018-12-12 18:54:46

标签: c# linq

我有这些课程:

User {
    //identity user class
    public IList<Proyecto> Proyectos { get; set; }
    public bool IsImportant { get; set }
}

Proyecto
{
   public Guid Id { get; set; }
   // more properties here    
}

我要做的是按userId将他们创建的所有项目分组,其中IsImportant为真。

我已经尝试过了

  var usuariosRobotVmInDb =await  _dbContext.Users.Include(p=>p.Proyectos)
            .groupby(u=>u.id)
            .Where(u => u.IsImportant== True)
            .Select(x=> new usuariosRobotViewModel
            {
                Id=x.Id,
                Name=x.Name,
                LastName=x.LastName,
                Phone=x.Phone,
                Email=x.Email,
                proyectosVms=x.Proyectos.Select(a=>new ProyectosVm {Id=a.Id,Date=a.Date})

            }).ToListAsync();

但是似乎我不能使用groupBy和where子句...如何解决此问题?谢谢

2 个答案:

答案 0 :(得分:2)

当您使用导航属性并且项目已经是User类的属性时,则不需要按任何内容进行分组。只需检索Important为真的用户:

 var result = await _dbContext.Users.Include(p => p.Proyectos)
                              .Where(u => u.IsImportant);

(当然,您也可以将投影添加到usuariosRobotViewModel对象中)

答案 1 :(得分:1)

LINQ的问题在于,开发人员仍在思考SQL方式,并试图将其转换为LINQ,这有时不起作用,有时也不是最佳选择。在您的情况下,当您包含Proyectos对象时,您正在使用导航属性,而LINQ已经知道UserProyectos对象之间的关系,因此您无需需要分组或执行其他任何操作:

var usuariosRobotVmInDb = await _dbContext.Users.Include(p => p.Proyectos)
        .Where(u => u.IsImportant) //Same as u.IsImportant == true
        .Select(x => new usuariosRobotViewModel {
            Id = x.Key,
            Nombre = x.Nombre,
            ...
        }).ToListAsync();