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