为了账号安全,请及时绑定邮箱和手机立即绑定

Linq 按 where 语法选择分组

Linq 按 where 语法选择分组

C#
动漫人物 2022-06-12 10:59:33
我有这些课程: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 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

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

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

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


查看完整回答
反对 回复 2022-06-12
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

LINQ 的问题在于,开发人员仍在以 SQL 方式思考并尝试将其转换为 LINQ,这有时不起作用,有时也不是最优的。在您的情况下,当您包含对象时,您正在使用导航属性,并且 LINQ 已经知道和对象Proyectos之间的关系,因此您不需要分组或执行任何其他操作: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();


查看完整回答
反对 回复 2022-06-12
  • 2 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信