我的场景是,我想在一种管理页面上列出所有用户登录和他们的角色,只有管理用户才能访问
在我的UserProfile模型中,由于我使用的是SimpleMembershipProvider,因此没有Role字段,因此我选择使用如下所示的ViewModel来解决此问题:
Imports WebMatrix.WebData
Public Class vmUserProfile
Public Property UserId As Integer
Public Property Username As String
Public Property Role As String
End Class
此后,在我创建ViewModel列表的控制器中,代码如下所示:
Public Function GetListOfUsers() As ActionResult
Dim users = From e In db.UserProfile
Select New vmUserProfile With {.UserId = e.UserId, _
.Username = e.UserName, _
.Role = Roles.GetRolesForUser(e.UserName)(0) _
}
Return PartialView("Partial/_UserList", users.ToList.OrderBy(Function(s) s.Username))
End Function
我遇到的问题是.Role = Roles.GetRolesForUser(e.UserName)(0)
,我很清楚LINQ to Entities对它不满意,因为它有数组。
我看过其他例子,看到其他人通过将相关数组索引放入一个单独的变量来解决这个问题,但就我而言,我不知道如何将其应用于我目前的困境。
我对VB很不熟悉,而且习惯了C#。我还倾向于使用linq的lambda语法,而不是查询语法。
但我会试试的!
这个错误我自己也见过几次了,我敢肯定,当你在linq-to-entities语句中调用一个无法转换为SQL的方法时,它会突然出现。在您的情况下,Roles.GetRolesForUser(e.UserName)(0)
无法转换为SQL。
恐怕我不能用查询语法编写VB或linq,但这里是我用C#和lambda语法编写的解决方案。这就是你现在拥有的:
var users =
db.UserProfile
.Select(e => new vmUserProfile()
{
UserId = e.UserID,
Username = e.Username,
Role = Roles.GetRolesForUser(e.UserName)(0)
})
如果你把它改成这样,它应该可以工作:
var users =
db.UserProfile
.Select(e => new
{
e.UserID,
e.Username
})
.ToList()
.Select(e => new vmUserProfile()
{
UserId = e.UserID,
Username = e.Username,
Role = Roles.GetRolesForUser(e.UserName)(0)
})
这里的关键区别在于,在将值选择到新的vmUserProfile
中之前,我通过调用ToList()
并调用`Roles.GetRolesForUser(e.UserName)(0),将包含UserID
和Username
的匿名对象列表拉入内存
编辑
我想试试VB版本!
Dim users =
From u In (
From e In db.UserProfile
Select New With
{
e.UserId,
e.UserName
}
).ToList
Select New vmUserProfile With
{
.UserId = e.UserId,
.Username = e.UserName,
.Role = Roles.GetRolesForUser(e.UserName)(0)
}