我有这个查询,我很难用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
答案 0 :(得分:2)
没有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!
当链接一些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();
然后,您可以将鼠标悬停在变量名称上并仔细检查类型是否符合预期,如果编译,您可以查看中间数据,也许可以看看为什么它可能无法正常工作
话虽如此,我不确定为什么如果另一个正常工作,你需要改变使用这种语法。