#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
. Пожалуйста, измените этот ответ с помощью фиксированного кода и отметьте свой собственный ответ как ответ, чтобы закрыть эту тему должным образом.