C# LINQ:最后用空值按升序对记录进行排序

C# LINQ:最后用空值按升序对记录进行排序,c#,mysql,linq,sorting,C#,Mysql,Linq,Sorting,我想根据名为DisplayOrder的列按升序对记录进行排序。如果DisplayOrder为null或0,则这些记录应为最后一条记录。默认情况下,0或null的DisplayOrder显示为顶部记录。我希望确保所有显示顺序为空的记录都出现在显示顺序为非空的记录之后,然后按显示顺序进行排序,从而确保所有显示顺序的记录都正确排序 下面是我是如何努力做到这一点的 public DataResponse<EKGType> GetByPage(KendoGridPost kendo)

我想根据名为DisplayOrder的列按升序对记录进行排序。如果DisplayOrder为null或0,则这些记录应为最后一条记录。默认情况下,0或null的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);
        }
    }
public DataResponse GetByPage(KendoGridPost kendo)
{
尝试
{
DataResponse=新的DataResponse(ResponseType.Failure);
使用(BusinessEntities上下文=新BusinessEntities())
{
IEnumerable items=context.EKGTypes
托利斯先生()
.选择(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;
}
返回响应;
}
捕获(例外情况除外)
{
返回HandleDataResponseException(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();
IEnumerable items=context.EKGTypes
托利斯先生()
.选择(c=>MapEntity(c))
.OrderBy(c=>
c、 DisplayOrder.HasValue
?(c.DisplayOrder==0?(int.MaxValue-1):c.DisplayOrder)
:int.MaxValue)
.ToList();
因此,您可以按
DisplayOrder
进行有效排序,而
DisplayOrder==null
的对象将被视为
DisplayOrder
int.MaxValue
的对象,而
DisplayOrder==0
的对象将被视为
int.MaxValue-1

因此,首先,所有非NULL和非-0将按其
显示顺序进行排序,然后是
0
的,最后是
NULL
值。
OrderBy()
方法允许您传入自定义比较器。比如:

public class NullAndZeroLastComparer : IComparer<int?>
{
    public int Compare(int? x, int? y)
    {
        int xValue = x.HasValue && x != 0 ? x.Value : int.MaxValue;
        int yValue = y.HasValue && y != 0 ? y.Value : int.MaxValue;
        return xValue.CompareTo(yValue);
    }
}
公共类NullAndZeroLastComparer:IComparer
{
公共整数比较(整数x,整数y)
{
int xValue=x.HasValue&&x!=0?x.Value:int.MaxValue;
int-yValue=y.HasValue&&y!=0?y.Value:int.MaxValue;
返回xValue.CompareTo(yValue);
}
}
然后你会像这样使用它:

IEnumerable<EKGTypes> items = context.EKGTypes
    .ToList()
    .Select(c => MapEntity(c))
    .OrderBy(c => c.DisplayOrder, new NullAndZeroLastComparer())
    .ToList();
IEnumerable items=context.EKGTypes
托利斯先生()
.选择(c=>MapEntity(c))
.OrderBy(c=>c.DisplayOrder,新的NullAndZeroLastComparer())
.ToList();

放置后??int.MaxValue我收到一个错误,即“运算符'?”不能应用于“bool”和“int”类型的操作数。是否删除了
.HasValue
?它只是
c.DisplayOrder??int.MaxValue
没有
HasValue
@RenéVogt该解决方案适用于空值,但是要求0也排在最后呢?很抱歉,我忘了取下.HasValue。正如您所说,它适用于空值,但我需要最后显示0的值,也需要类似的答案,但我更喜欢将逻辑直接放入
OrderBy
中,而不是为此创建一个全新的类+1无论如何