2017-05-01 105 views
-1

我有这个查询,我很难用lambda表达式写它。如何用lambda表达式重写此LINQ查询?

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

+2

什么是错误信息?你可以显示你尝试过的lambda吗? – Fabio

+0

你有没有试过linqpad ...复制粘贴你的查询,它会返回你的Lambda表达式。 – loneshark99

+0

不,直到你提到它才知道Linqpad。现在就看看它。 – StraightUp

回答

2

没有UserId,因为你已经选择了r.Namer.Name不具有UserId一个属性)。在其他形式的where

所以就像select之中,只是重新为了把WhereSelect

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(); 

然后,您可以将鼠标悬停在变量名和仔细检查了是世界卫生大会你期望,如果它编译,你可以看看中间数据,也许看看为什么它可能不工作。

这就是说,我不知道为什么你需要改变使用这种语法,如果其他工作正常。

+0

当我这样做时,我不会为'Select'子句选择'Name'。它就像是或者,当我使它成为'(ur,r)=> ur'我可以选择UserId。但不能选择'名称'? – StraightUp

+0

@StraightUp我更新了一下我的答案:尝试将其分解为多个语句并验证每个类型的类型是您期望的。 – crashmstr

+0

因为我在方法中使用其他语法,并在列表中调用它并将其设置为“RolesList”。但是我收到一条错误消息,提示“此方法不支持物化查询结果”。所以,我认为将其改为lambda表达式查询可能会解决该问题。 – StraightUp