вложенная проекция выбора с индексом в linq с использованием EF Core - PullRequest
0 голосов
/ 12 мая 2018

Я только что изменил запрос linq для включения индекса. Индекс необходим, чтобы помочь клиентскому веб-приложению управлять возвращенными элементами (добавление, удаление, обновление, дублирование и т. Д.). Эта часть работает с макетными данными на стороне клиента, поэтому ей нужна такая же структура формата, которая возвращается с сервера. Индекс должен быть упорядочен как 0,1,2, ..

Ниже приведен пример того, что я пытаюсь сделать:

Допустим, я хочу найти список городов в стране, в которой есть штаты / провинции.

Итак, у меня есть следующие два класса:

public class CityItemDTO {
   public int id { get; set; }
   public City item {get; set; }
}

public class CityDTO {
    public string name {get; set;}
    public string stateName {get; set; }
    public int population {get; set; }
}

Я хочу добавить индекс вместе со списком городов и штатов:

var cities = context.Countries
    .Where(s => query.Name == s.Name)
    .Select((s,index) => new CityItemDTO
    {
        id = index,
        item = new CityDTO()
        {
            name = s.name,
            stateName = s.stateName
            population = s.population
        }
    });

Но я получаю странную ошибку:

«Не удалось разобрать значение выражения» (Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1 [DataService.Models.Countries]). Где (s => (__query_Name_0 == s.Name)). Выбрать ((s) , index) => new CityItemDTO () {id = index, item = new CityDTO () {Name = s.Name, StateName = s.StateName, Population = s.Population}}) ': эта перегрузка метода' System .Linq.Queryable.Select 'в настоящее время не поддерживается. "

Однако, если я уберу индекс, сработает следующее:

var cities = context.Countries
    .Where(s => query.Name == s.Name)
    .Select(s => new CityDTO
    {
        new CityDTO()
        {
            name = s.name,
            stateName = s.stateName
            population = s.population
        }
    });

1 Ответ

0 голосов
/ 12 мая 2018

Видимо, на этот вопрос уже был дан ответ, потому что из-за новой структуры сообщение об ошибке отличается, и из-за того, как я добрался до ответа, думая, что прогнозы влияют на работу индексатора.

LINQ to Entities не распознает метод 'System.Linq.IQueryable`

Все, что мне нужно было сделать, это добавить AsEnumerable (), который преобразует результат в объекты C #, а затем выбрать(сохраняя логику, которая у меня была изначально) добавит индекс к итерациям.

var cities = context.Countries
.Where(s => query.Name == s.Name)
.AsEnumerable()    //  where the magic happens
.Select(s => new CityDTO
{
    new CityDTO()
    {
        name = s.name,
        stateName = s.stateName
        population = s.population
    }
});
...