我想基于称为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
的那些视为它们的DisplayOrder
是int.MaxValue
,而将DisplayOrder == 0
的那些视为它们DisplayOrder
是int.MaxValue - 1
。因此,首先所有非NULL和非0的值将按其
DisplayOrder
排序,然后依次是具有0
和NULL
值的值。