【问题标题】:How to get IQueryable<T> from IQueryable<IQueryable<T>>?如何从 IQueryable<IQueryable<T>> 获取 IQueryable<T>?
【发布时间】:2020-12-22 22:46:33
【问题描述】:

我正在尝试从供应商处获得Orders 中的PagedList。它有ICollectionOrders。

CreateAsync 方法需要 IQueryableOrders 但我有 IQueryableVenders ??

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);
}

【问题讨论】:

    标签: entity-framework asp.net-core iqueryable


    【解决方案1】:

    解决此问题的方法是使用 SelectMany 而不是 Select。

    Select:返回一个 IQueryable,其元素是对 source 的每个元素调用投影函数的结果。

    SelectMany: 一个 IQueryable,其元素是在 source 的每个元素上调用一对多投影函数 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);
                
            }
    

    【讨论】:

    • 欢迎使用 StackOverflow。 SelectMany 绝对正确。请使用固定代码修改此答案并将您自己的答案标记为正确关闭此主题的答案。
    猜你喜欢
    • 2013-09-03
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多