LINQ 错误 - 无法将 IEnumerable<IEnumerable<object>> 转换为 Enumerable<object>

LINQ error- cannot covert IEnumerable<IEnumerable<object>> to IEnumerable<object>

这是代码:

IEnumerable<StockVendorHistoryModal> vendorhistoryList
    = Session.Query<PurchaseOrderLineItem>()
             .Where(popredicate)
             .Where(p => p.Stock.Number != null)
             .Select(c => new StockVendorHistoryModal
                    {
                        StockId = c.Stock.Id,
                        LastPurchaseDate = c.PurchaseOrder.OrderDate.ToString("yyyy/MM/dd"),
                        VendorNumber = c.PurchaseOrder.PurchaseOrderVendor.Vendor.Number,
                        LastPurchasePrice = c.UnitPrice,
                        LastTransactionDate =
                            c.LastTransactionDate != null ? c.LastTransactionDate.Value.ToString("yyyy/MM/dd") : null,
                        LeadTimeDays = GetDays(c.PurchaseOrder.OrderDate, c.LastTransactionDate),
                    })
             .GroupBy(d => d.VendorNumber).ToList()
             .Select(gpo => gpo.OrderByDescending(x => x.LastPurchaseDate)
             .Take(4); 

导致此错误的原因:

Cannot convert IEnumerable<IEnumerable<object>> to IEnumerable<object>

我不明白。解决方法是什么?

IEnumerable<StockVendorHistoryModal> vendorhistoryList
= Session.Query<PurchaseOrderLineItem>()
         .Where(popredicate)
         .Where(p => p.Stock.Number != null)
         .Select(c => new StockVendorHistoryModal
                {
                    StockId = c.Stock.Id,
                    LastPurchaseDate = c.PurchaseOrder.OrderDate.ToString("yyyy/MM/dd"),
                    VendorNumber = c.PurchaseOrder.PurchaseOrderVendor.Vendor.Number,
                    LastPurchasePrice = c.UnitPrice,
                    LastTransactionDate =
                        c.LastTransactionDate != null ? c.LastTransactionDate.Value.ToString("yyyy/MM/dd") : null,
                    LeadTimeDays = GetDays(c.PurchaseOrder.OrderDate, c.LastTransactionDate),
                })
         .GroupBy(d => d.VendorNumber).ToList()
         .Select(gpo => gpo.OrderByDescending(x => x.LastPurchaseDate)
         .Take(4)
         .Select(g => g.First()); 

您似乎正在选择一组集合。你需要的是展平你选择的任何东西。您将通过将 Select 替换为 SelectMany.

来实现您的目标
        IEnumerable<StockVendorHistoryModal> vendorhistoryList = Session.Query<PurchaseOrderLineItem>()
            .Where(popredicate)
            .Where(p => p.Stock.Number != null)
            .Select(c => new StockVendorHistoryModal
            {
                StockId = c.Stock.Id,
                LastPurchaseDate = c.PurchaseOrder == null ? null : c.PurchaseOrder.OrderDate.ToString("yyyy/MM/dd"),
                VendorNumber =   c.PurchaseOrder == null ? string.Empty : c.PurchaseOrder.PurchaseOrderVendor.Vendor.Number,
                VendorName = c.PurchaseOrder == null ? string.Empty : c.PurchaseOrder.PurchaseOrderVendor.Vendor.Name,
                LastPurchasePrice = c.UnitPrice,
                LastTransactionDate = c.LastTransactionDate != null ? c.LastTransactionDate.Value.ToString("yyyy/MM/dd") : null,
                LeadTimeDays = GetDays(c.PurchaseOrder.OrderDate, c.LastTransactionDate),
            }).GroupBy(d => d.VendorNumber)
            .SelectMany(gpo => gpo.OrderByDescending(x => x.LastPurchaseDate).Take(4)); 

这完全符合我的要求。