0

我正在使用 OData 语法获取数据: http ://server.com/api/users ?$skip=20&$top=10

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

LINQ to Entities 无法识别方法 'System.Linq.IQueryable 1[WebPortal.Models.UserDto] Select[UserInDatabase,UserDto](System.Linq.IQueryable1[DataContext.UserInDatabase], System.Linq.Expressions.Expression 1[System.Func3[DataContext.Media,System.Int32,WebPortal.Models.UserDto]])' 方法和此方法无法转换为存储表达式。","ExceptionType":"System.NotSupportedException"

据我了解,在使用实体框架上下文时我无法使用 Select(u, index)=> 选择器(适用于内存收集)。不幸的是,我使用它通过 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

4

1 回答 1

1

尝试更改此行:

return _repository.Users

return _repository.Users.AsEnumerable()

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

于 2013-10-28T23:31:11.550 回答