LINQ表达式节点类型' ArrayIndex' LINQ to Entities不支持。 MVC用户档案建议

时间:2015-02-05 09:08:38

标签: asp.net-mvc vb.net linq

我的方案是,我想在一个管理页面列出所有用户登录及其角色,只有管理员用户才能访问

在我的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因为数组而不满意。

我看过其他的例子,看到其他人通过将相关的数组索引放入一个单独的变量来解决这个问题,但对于我的生活,我看不出如何将其应用到我目前的困境中。

1 个答案:

答案 0 :(得分:0)

我用VB很垃圾,习惯了C#。我也倾向于使用linq的lambda语法而不是查询语法。

但我会试一试!

我已经多次看到这个错误,并且我很确定当你在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) 
    }