Контроллер WebAPI с IQueryable‹T› выдает LINQ to Entities, не распознает ошибку метода

Я получаю данные с помощью синтаксиса OData: http://server.com/api/users?$ пропустить=20&$вверх=10

Я пытаюсь добавить индекс к каждому извлеченному объекту в моем контроллере веб-API. Каждый раз, когда я получаю следующую ошибку:

LINQ to Entities не распознает метод System.Linq.IQueryable1[WebPortal.Models.UserDto] Select[UserInDatabase,UserDto](System.Linq.IQueryable1[DataContext.UserInDatabase], System.Linq.Expressions.Expression1[System.Func3[DataContext.Media,System.Int32,WebPortal.Models.UserDto]]) и этот метод не может быть преобразовано в выражение хранилища.","ExceptionType":"System.NotSupportedException"

Насколько я понимаю, я не мог использовать селектор Select(u, index)=> при работе с контекстом 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; }
}

ТИА


person Alexey Strakh    schedule 28.10.2013    source источник


Ответы (1)


Попробуйте изменить эту строку:

return _repository.Users

to

return _repository.Users.AsEnumerable()

Это должно заставить запрос выполняться перед проецированием на ваш DTO.

person Phil Sandler    schedule 28.10.2013
comment
к сожалению, это не так, потому что запрос извлекает все данные из базы данных ДО применения фильтра. У меня там тысячи строк. Именно по этой причине я ввожу нумерацию страниц. - person Alexey Strakh; 29.10.2013
comment
Сделайте свой код разбиения на страницы/фильтрации (пропустить/взять) до AsEnumerable(). Ваш индекс также должен учитывать, сколько строк вы пропустили (он будет начинаться с 0 независимо от того, сколько вы пропустили). - person Phil Sandler; 29.10.2013