C# 如何使用lambda表达式重写此LINQ查询?

C# 如何使用lambda表达式重写此LINQ查询?,c#,linq,lambda,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

我有一个查询,我很难用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
子句中的点运算符之后,我找不到
UserId
没有
UserId
,因为您已经选择了
r.Name
r.Name
没有
UserId
的属性)

因此,就像另一种形式中的
select
位于
where
之后一样,只需重新排序,将
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!
db.Set()
.Join(db.Roles,ur=>ur.RoleId,r=>r.Id,(ur,r)=>r)
.Where(x=>x.UserId==UserId)//其中第一个,
.Select(r=>r.Name)//然后从筛选结果中选择!
当链接多个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();
var join=db.Set()
.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();
然后,您可以将鼠标悬停在变量名上,仔细检查类型是否符合预期,如果它已编译,您可以查看中间数据,或许可以了解它可能无法工作的原因


尽管如此,我不知道如果另一个语法工作正常,为什么需要更改以使用此语法。

什么是错误消息?你能告诉兰博达斯你试过了吗?你试过林帕德吗。。。复制粘贴您的查询,它将返回Lambda表达式..不,在您提到Linqpad之前,我不知道它。我现在会调查的。把选择放在where后面。您正试图在字符串对象上使用
.UserId
。当我这样做时,我无法为
select
子句选择
Name
。就像或者,当我设置为
(ur,r)=>ur
时,我可以选择UserId。但是不能选择
Name
?@我更新了我的答案:尝试将其拆分为多个语句,并验证每个语句的类型是否符合您的预期。因为我在方法中使用了其他语法,并在列表中调用它,并将其设置为
RolesList
。但我收到一条错误消息,说“对于具体化的查询结果不支持此方法”。因此,我认为将其更改为lambda表达式查询可能会解决此问题。lambda表达式查询和查询语法查询之间没有区别,但遗憾的是,查询语法在C#中更受限制-编译器只是将查询语法转换为lambda语法。与此问题相关的一些问题可能会有所帮助:
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();