C# 如何使用lambda表达式重写此LINQ查询?
我有一个查询,我很难用lambda表达式来写它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
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();