我想基于名为DisplayOrder的列按升序对记录进行排序。如果DisplayOrder为null或0,那么这些记录应该是最后一个。默认情况下,DisplayOrder为0或null显示为最高记录。我想确保所有带有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。
答案 0 :(得分:3)
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);
}
}
然后你就像使用它一样:
IEnumerable<EKGTypes> items = context.EKGTypes
.ToList()
.Select(c => MapEntity(c))
.OrderBy(c => c.DisplayOrder, new NullAndZeroLastComparer())
.ToList();
答案 1 :(得分:1)
您可以对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
的{{1}}被DisplayOrder
int.MaxValue
和DisplayOrder == 0
的{{1}}视为DisplayOrder
他们的int.MaxValue - 1
是DisplayOrder
因此,首先所有非NULL和非0将按其0
排序,然后是NULL
,最后是WHERE 1=1
AND b.Year(b.CreateDate) >= '2016'
AND B.ProcedureCode1 IN ('G0277','99183')
OR B.ProcedureCode2 IN ('G0277','99183')
OR B.ProcedureCode3 IN ('G0277','99183')
OR B.ProcedureCode4 IN ('G0277','99183')
OR B.ProcedureCode5 IN ('G0277','99183')
OR B.ProcedureCode6 IN ('G0277','99183')
OR B.ProcedureCode7 IN ('G0277','99183')
OR B.ProcedureCode8 IN ('G0277','99183')
OR B.ProcedureCode9 IN ('G0277','99183')
OR B.ProcedureCode10 IN ('G0277','99183')
值。