我的方案是,我想在一个管理页面列出所有用户登录及其角色,只有管理员用户才能访问
在我的UserProfile模型中,没有Role的字段,因为我正在使用SimpleMembershipProvider,因此我选择使用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因为数组而不满意。
我看过其他的例子,看到其他人通过将相关的数组索引放入一个单独的变量来解决这个问题,但对于我的生活,我看不出如何将其应用到我目前的困境中。
答案 0 :(得分:0)
但我会试一试!
我已经多次看到这个错误,并且我很确定当你在linq to entity语句中调用一个它无法转换为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)
})
这里的关键区别在于,在将值选择为UserID
之前,我通过调用Username
将包含ToList()
和vmUserProfile
的匿名对象列表提取到内存中并调用`Roles.GetRolesForUser(e.UserName)(0)
修改强>
我以为我对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)
}