我有这些课程:
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子句...如何解决此问题?谢谢
答案 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已经知道User
和Proyectos
对象之间的关系,因此您无需需要分组或执行其他任何操作:
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();