C# LINQ to实体无法识别方法“System.LINQ.IQueryable”…,并且无法将此方法转换为存储表达式

C# LINQ to实体无法识别方法“System.LINQ.IQueryable”…,并且无法将此方法转换为存储表达式,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一个方法GetRoles来获取每个用户分配的角色,我在IQueryable中调用这个方法来生成角色列表。每次尝试加载表时,我都会收到下面的错误消息,我不理解此错误消息的含义。有人能帮我解决这个问题吗 LINQ to Entities无法识别方法'System.LINQ.IQueryable'1[System.String]GetRoleSystem.String'方法,此方法无法转换为存储表达式 GetRolesByUserId方法 我在下面的GetUsers中调用上述方法 private

我有一个方法GetRoles来获取每个用户分配的角色,我在IQueryable中调用这个方法来生成角色列表。每次尝试加载表时,我都会收到下面的错误消息,我不理解此错误消息的含义。有人能帮我解决这个问题吗

LINQ to Entities无法识别方法'System.LINQ.IQueryable'1[System.String]GetRoleSystem.String'方法,此方法无法转换为存储表达式

GetRolesByUserId方法

我在下面的GetUsers中调用上述方法

private async Task<IQueryable<UserViewModel>> GetUsers(ApplicationDbContext db, IDbSet<ApplicationUser> users)
{
    ...........

    var userlist = userlist.Join(db.ServicesUsers, u => u.Id, hu => hu.UserId, (u, hu) => new UserViewModel()
    {
        ID = u.Id,
        Username = u.UserName,
        FirstName = hu.FirstName,
        LastName = hu.LastName,
        Email = u.Email,            
        RoleList = GetRoles(u.Id),
        Roles = "",
    });
    return hsuserlist;
但在错误详细信息页面中,这一行是红色的,表示这是有错误的行

列表显示任务=filteredUsers.Skipparam.iDisplayStart.Takeparam.iDisplayLength.ToList

上面的一行位于显示表的方法UsersGrid中

public async Task<ActionResult> UserGrid(DataTablesViewModel param)
{
    using (var db = new Infrastructure.Data.ApplicationDbContext())
    {
        db.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

        //var data = await GetUserData(db);

        var users = db.Users;
        var data = GetUsers(db, users);

        IQueryable<UserViewModel> filteredUsers = data.Result;

         ..........
        List<UserViewModel> displayedTasks = filteredUsers.Skip(param.iDisplayStart).Take(param.iDisplayLength).ToList();

    }

值得一提的是,直到那一行您才看到错误的原因是,当您调用.ToList时,您的查询是在那一行执行的。在此之前,您只需编译LINQ表达式。您可以在这里了解到:它正在尝试将GetRoles转换为Sql/store函数。是否有其他方法对其进行编辑以将其转换为LinQ IQueryable非数据库查询?请说明如何调用GetRoles方法,因为错误消息明确指出这是问题所在。我在角色列表的GetUsers方法中调用它。
public async Task<ActionResult> UserGrid(DataTablesViewModel param)
{
    using (var db = new Infrastructure.Data.ApplicationDbContext())
    {
        db.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

        //var data = await GetUserData(db);

        var users = db.Users;
        var data = GetUsers(db, users);

        IQueryable<UserViewModel> filteredUsers = data.Result;

         ..........
        List<UserViewModel> displayedTasks = filteredUsers.Skip(param.iDisplayStart).Take(param.iDisplayLength).ToList();

    }