具有IQueryable <t>的WebAPI控制器抛出“LINQ to Entities无法识别方法”错误</t>

时间:2013-10-28 22:16:45

标签: asp.net-mvc asp.net-web-api indexing entity-framework-5 iqueryable

我正在使用OData语法获取数据: ?http://server.com/api/users $跳过= 20&安培; $顶部= 10

我正在尝试在我的Web API Controller中为每个获取的实体添加索引。 每次我收到以下错误:

  

LINQ to Entities无法识别该方法   “System.Linq.IQueryable 1[WebPortal.Models.UserDto] Select[UserInDatabase,UserDto](System.Linq.IQueryable 1 [DataContext.UserInDatabase]   System.Linq.Expressions.Expression 1[System.Func 3 [DataContext.Media,System.Int32,WebPortal.Models.UserDto]])”   方法,这个方法无法翻译成商店   表达 “” ExceptionType。 “:” System.NotSupportedException“

据我所知,我无法使用Select(u,index)=&gt;使用Entity Framework上下文时的选择器(适用于内存集合)。不幸的是,我正在使用它来通过OData + QueryableAttribute公开我的收藏:

public class UsersController : ApiController
{
    [Queryable]
    public IQueryable<UserDto> Get()
    {
        return _repository.Users
                .Select((u, i) => new UserDto
                    {
                        Index = i,
                        Name = u.Name,
                        Age = u.Age
                    })
                .AsQueryable();
    }
}

如何修改获取进程以继续使用OData语法并能够将具有索引的实体返回到请求方?

我的实体:

public class UserInDatabase
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class UserDto
{
    public int Index { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

TIA

1 个答案:

答案 0 :(得分:1)

尝试更改此行:

return _repository.Users

return _repository.Users.AsEnumerable()

这会强制查询在投影到您的DTO之前执行。