如何用lambda表达式重写这个LINQ查询?

时间:2017-05-01 17:54:38

标签: c# linq lambda

我有这个查询,我很难用lambda表达式编写它。

var userRoles = from ur in db.Set<IdentityUserRole>()
                  join r in db.Roles
                    on ur.RoleId equals r.Id
                  where ur.UserId == userId
                  select r.Name;

我收到带有Where()子句的错误消息。

db.Set<IdentityUserRole>()
     .Join(db.Roles, ur => ur.RoleId, r => r.Id, (ur, r) => r)
     .Select(r => r.Name)
     .Where(x => x.)

Where子句中的点运算符之后,我找不到UserId

1 个答案:

答案 0 :(得分:2)

没有UserId,因为您已选择r.Namer.Name没有UserId的属性。)

就像selectwhere之后的另一种形式一样,只需重新排序即可将Where放在Select之前:

db.Set<IdentityUserRole>()
  .Join(db.Roles, ur => ur.RoleId, r => r.Id, (ur, r) => r)
  .Where(x => x.UserId == userId) //where first,
  .Select(r => r.Name) //then select from the filtered results!

当链接一些LINQ语句时某些东西不起作用时,它可以通过将它们分开来帮助调试:

var join = db.Set<IdentityUserRole>()
  .Join(db.Roles, ur => ur.RoleId, r => r.Id, (ur, r) => r).ToList();
var where = join.Where(x => x.UserId == userId).ToList();
var select = where.Select(r => r.Name).ToList();

然后,您可以将鼠标悬停在变量名称上并仔细检查类型是否符合预期,如果编译,您可以查看中间数据,也许可以看看为什么它可能无法正常工作

话虽如此,我不确定为什么如果另一个正常工作,你需要改变使用这种语法。