LINQ to Entities 不支持 LINQ 表达式节点类型 'ArrayIndex'。 MVC 用户配置文件建议
The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities. MVC User Profile Advice
我的方案是我想在某种管理页面上列出所有用户登录名及其角色,只有管理员用户才能访问
在我的 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 对数组不满意。
我看过其他例子,发现其他人通过将相关数组索引放入一个单独的变量中解决了这个问题,但对于我来说,我不知道如何将其应用到我当前的困境中。
我对 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
并调用 `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)
}
我的方案是我想在某种管理页面上列出所有用户登录名及其角色,只有管理员用户才能访问
在我的 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 对数组不满意。
我看过其他例子,发现其他人通过将相关数组索引放入一个单独的变量中解决了这个问题,但对于我来说,我不知道如何将其应用到我当前的困境中。
我对 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
并调用 `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)
}