LINQ 没有正确排序 List<>

LINQ not sorting List<> properly

我的 EF 查询应该按列表中第一个产品的日期排序,但由于某种原因,它只对大部分产品进行排序,并且某些日期的顺序错误。

这是代码...

using (var context = new SalesEntities())
{
   var groupedData = context.s84_Schedule.AsExpandable()
      .Where(predicate)
      .GroupBy(c => new { c.CustomerID, c.s84_Customer.CustomerName, c.SubdivisionID, c.s84_Subdivision.SubdivisionName, c.LotNumber })
      .Select(grouped => new s84_Report_Project_POCO
      {
         CustomerID = grouped.Key.CustomerID,
         CustomerName = grouped.Key.CustomerName,
         SubdivisionID = grouped.Key.SubdivisionID,
         SubdivisionName = grouped.Key.SubdivisionName,
         LotNumber = grouped.Key.LotNumber,
         Products = grouped.Select(x => new s84_Report_Project_Product
         {
            ProductID = x.ProductID,
            ProductName = x.s84_Product.ProductName,
            ProductDate = x.CustomerExpectedDate,
            FieldRepID = x.FieldRepID,
            FieldRepName = x.s84_FieldRep.FieldRepName,
            InstallerID = x.InstallerID,
            InstallerName = x.s84_Installer.InstallerName,
            StatusID = x.StatusID,
            StatusColor = x.s84_Status.StatusColor,
            StatusName = x.s84_Status.StatusName,
            Completed = x.Completed
         }).ToList()
      });

   var finalList = groupedData.ToList().Where(x => x.Products.Last().Completed == false).ToList();

   List<s84_Report_Project_POCO> lst = finalList.OrderBy(x => x.Products.First().ProductDate).ToList();
   return lst;
}

代码对我来说似乎不错,但看看其中一个日期是如何乱序的...

weird sorting http://www.84sales.com/weird_sort.png

尝试按第一个 select

进行排序
var groupedData = context.s84_Schedule.AsExpandable()
                              .Where(predicate)
                              .GroupBy(c => new { c.CustomerID,
                                                  c.s84_Customer.CustomerName, 
                                                  c.SubdivisionID, 
                                                  c.s84_Subdivision.SubdivisionName, 
                                                  c.LotNumber })
                              .Select(grouped => new s84_Report_Project_POCO
                              {
                                  CustomerID = grouped.Key.CustomerID,
                                  CustomerName = grouped.Key.CustomerName,
                                  SubdivisionID = grouped.Key.SubdivisionID,
                                  SubdivisionName = grouped.Key.SubdivisionName,
                                  LotNumber = grouped.Key.LotNumber,
                                  Products = grouped
                                    .Select(x => new s84_Report_Project_Product
                                  {
                                      ProductID = x.ProductID,
                                      ProductName = x.s84_Product.ProductName,
                                      ProductDate = x.CustomerExpectedDate,
                                      FieldRepID = x.FieldRepID,
                                      FieldRepName = x.s84_FieldRep.FieldRepName,
                                      InstallerID = x.InstallerID,
                                      InstallerName = x.s84_Installer.InstallerName,
                                      StatusID = x.StatusID,
                                      StatusColor = x.s84_Status.StatusColor,
                                      StatusName = x.s84_Status.StatusName,
                                      Completed = x.Completed
                                  }).OrderBy(x => x.CustomerExpectedDate).ToList()
                              });

问题是.First()函数,returns第一条记录,但不一定按日期顺序。如果您希望按日期对分组数据进行排序,以便 First() 函数 returns 是最近的日期,则需要在对数据进行分组之前对数据进行排序,然后使用 First()函数:

using (var context = PrimaryConnection.returnNewConnection())
        {
            var groupedData = context.s84_Schedule.AsExpandable()
                              .Where(predicate)
                              .GroupBy(c => new { c.CustomerID, c.s84_Customer.CustomerName, c.SubdivisionID, c.s84_Subdivision.SubdivisionName, c.LotNumber })
                              .Select(grouped => new s84_Report_Project_POCO
                              {
                                  CustomerID = grouped.Key.CustomerID,
                                  CustomerName = grouped.Key.CustomerName,
                                  SubdivisionID = grouped.Key.SubdivisionID,
                                  SubdivisionName = grouped.Key.SubdivisionName,
                                  LotNumber = grouped.Key.LotNumber,
                                  Products = grouped
                                    .Select(x => new s84_Report_Project_Product
                                  {
                                      ProductID = x.ProductID,
                                      ProductName = x.s84_Product.ProductName,
                                      ProductDate = x.CustomerExpectedDate,
                                      FieldRepID = x.FieldRepID,
                                      FieldRepName = x.s84_FieldRep.FieldRepName,
                                      InstallerID = x.InstallerID,
                                      InstallerName = x.s84_Installer.InstallerName,
                                      StatusID = x.StatusID,
                                      StatusColor = x.s84_Status.StatusColor,
                                      StatusName = x.s84_Status.StatusName,
                                      Completed = x.Completed
                                  }).Orderby(t => t.CustomerExpectedDate).ToList()
                              });

            var finalList = groupedData.ToList().Where(x => x.Products.Last().Completed == false).ToList();

            List<s84_Report_Project_POCO> lst = finalList.OrderBy(x => x.Products.First().ProductDate).ToList();

所有 SQL 查询(以及附加到 SQL 数据库时的 Linq 查询)都有随机顺序,除非您对它们进行排序。

产品未排序 - 因此它具有随机顺序。 您按 Products.First() 排序,但产品的顺序是随机的,因此您的排序也是随机的。

确保产品在查询中排序,这样应该没问题。

  Products = grouped.Select(....)
                    .OrderBy(x => x.ProductDate)
                    .ToList()