Как получить IQueryable из IQueryable<IQueryable>?

#entity-framework #asp.net-core #iqueryable

#entity-framework #asp.net-core #iqueryable

Вопрос:

Я пытаюсь получить PagedList из Order s от продавца. Он имеет ICollection of Order s.

CreateAsync метод требует IQueryable of Order s, но у меня есть IQueryable of Vender s??

 public async Task<PagedList<Order>> GetVenderOrders(int venderId, OrderParams orderParams)
{
    var vender = _dataContext.Venders.Include(v => v.Orders)
        .ThenInclude(o => o.RentedCar).Where(v => v.VenderId == venderId);

    var orders = vender.Select(x => x.Orders.AsQueryable());

    return await PagedList<Order>.CreateAsync(orders, orderParams.PageNumber, orderParams.PageSize);
}

public static async Task<PagedList<T>> CreateAsync(IQueryable<T> source, int pageNumber, int pageSize)
{
    var count = await source.CountAsync();
    var items = await source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToListAsync();
    return new PagedList<T>(items, count, pageNumber, pageSize);
}
  

Ответ №1:

Решение этой проблемы заключается в использовании SelectMany вместо Select.

Select: возвращает IQueryable, элементы которого являются результатом вызова функции проекции для каждого элемента источника.

SelectMany: IQueryable, элементы которого являются результатом вызова функции проекции «один ко многим» collectionSelector для каждого элемента источника, а затем отображения каждого из этих элементов последовательности и соответствующего им элемента источника в элемент результата.

 public async Task<PagedList<Order>> GetVenderOrders(int venderId, OrderParams orderParams)
        {
            var orders = _dataContext.Venders.Include(v => v.Orders)
                .ThenInclude(o => o.RentedCar).Where(v => v.VenderId == venderId)
                .SelectMany(x => x.Orders);


            return await PagedList<Order>.CreateAsync(orders ,orderParams.PageNumber, orderParams.PageSize);
            
        }
  

Комментарии:

1. Приветствуем StackOverflow. Вы абсолютно правы с SelectMany . Пожалуйста, измените этот ответ с помощью фиксированного кода и отметьте свой собственный ответ как ответ, чтобы закрыть эту тему должным образом.