вложенная проекция выбора с индексом в linq с использованием EF Core

Я только что изменил запрос 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
        }
    });

person sksallaj    schedule 11.05.2018    source источник
comment
EF не превратит Select с индексом в запрос SQL.   -  person JSteward    schedule 12.05.2018
comment
Но я видел примеры, которые делают это, но есть ли способ получить индекс или есть другой способ сделать это, мне нужно добавить индекс к решению. Кроме того, почему мне отказали? Вопрос довольно простой.   -  person sksallaj    schedule 12.05.2018
comment
В запросе SQL нет индекса, если его нет в таблице. Вы ищете Id города? Если да, то есть ли в таблице Id столбец? Это можно легко сопоставить, но произвольный индекс - это не то же самое.   -  person JSteward    schedule 12.05.2018
comment
Мне не нужен идентификатор, индекс предназначен для подсчета выбранных элементов, клиент ожидает этого формата ... Мне, возможно, придется преобразовать в список ... и сделать еще одну итерацию с помощью foreach. Это ошибка времени выполнения, если это невозможно, эта ошибка должна быть выдана во время компиляции.   -  person sksallaj    schedule 12.05.2018
comment
все еще жестоко, что я получил отрицательное голосование только потому, что я не знал, что вы не можете включить индексатор в оператор sql .. нет голосов за нарушение политик stackoverflow при задании вопроса   -  person sksallaj    schedule 12.05.2018


Ответы (2)


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

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

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

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
    }
});
person sksallaj    schedule 11.05.2018

На самом деле этот запрос LINQ просто можно перевести в строку индексации с помощью dbfunction row_number () over () (по крайней мере, для postgreSQL), но на данный момент (февраль 2021 г.) все еще не поддерживается.

person iPilot    schedule 22.02.2021
comment
stackoverflow.com/help/how-to-answer - person yusuf hayırsever; 22.02.2021