我想基于称为DisplayOrder的列以升序对记录进行排序。如果DisplayOrder为null或0,则这些记录应排在最后。默认情况下,带有0或null的DisplayOrder显示为顶部记录。我想确保所有具有NULL DisplayOrder的记录都出现在具有非NULL DisplayOrder的记录之后,然后按DisplayOrder排序,以确保所有具有DisplayOrder的记录都正确排序。

这就是我试图做到的方式。

public DataResponse<EKGType> GetByPage(KendoGridPost kendo)
    {
        try
        {
            DataResponse<EKGType> response = new DataResponse<EKGType>(ResponseType.Failure);

            using (BusinessEntities context = new BusinessEntities())
            {


                IEnumerable<EKGTypes> items = context.EKGTypes
                                                     .ToList()
                                                     .Select(c => MapEntity(c))
                                                     .OrderBy(c => c.DisplayOrder.HasValue)
                                                     .ToList();

                response.Data = items.Skip(kendo.Skip).Take(kendo.PageSize).ToList();
                response.Count = items.Count();
                response.ResponseType = ResponseType.Success;
            }

            return response;
        }
        catch (Exception ex)
        {
            return HandleDataResponseException<EKGType>(ex);
        }
    }


这将首先返回具有null / 0值的记录。我一直在搜索过去一个小时,可以在sql中找到答案,但在linq中却找不到。

最佳答案

您可以使用int.MaxValue或使用NULL的对象:

IEnumerable<EKGTypes> items = context.EKGTypes
                              .ToList()
                              .Select(c => MapEntity(c))
                              .OrderBy(c =>
                                  c.DisplayOrder.HasValue
                                  ? (c.DisplayOrder == 0 ? (int.MaxValue - 1) : c.DisplayOrder)
                                  : int.MaxValue)
                              .ToList();


因此,您可以有效地按DisplayOrder进行排序,而将DisplayOrder == null的那些视为它们的DisplayOrderint.MaxValue,而将DisplayOrder == 0的那些视为它们DisplayOrderint.MaxValue - 1
因此,首先所有非NULL和非0的值将按其DisplayOrder排序,然后依次是具有0NULL值的值。

10-05 19:16