1 根据条件来选择排序对象
因为涉及到联查对象的属性排序,所以不能直接根据条件排序分页
比如:
public static IQueryable<T> ToPage<T>(IQueryable<T> allItems, int pageIndex, int pageSize)
{
if (pageIndex < 1)
pageIndex = 1;
var itemIndex = (pageIndex - 1) * pageSize;
var pageOfItems = allItems.Skip(itemIndex).Take(pageSize);
return pageOfItems;
}
MQuery = MQuery.OrderByDescending(o => o.ID);
MQuery = DbContextHelp.ToPage<ticket>(MQuery, pageIndex, pageSize);
var List = (from ticket in MQuery
join TicketLose in dbContext.TicketLose
on ticket.ID equals TicketLose.ticketid
into TicketLosetemp
select new
{
name = ticket.name,
activationTime = act.ActivationTime,
}).ToList();
这样是在结果集出来之前排序,是无法对联查表的属性排序。
改为这样
var orderQuery= (from ticket in MQuery
join TicketLose in dbContext.TicketLose
on ticket.ID equals TicketLose.ticketid
into TicketLosetemp
select new
{
name = ticket.name,
activationTime = act.ActivationTime,
});
var reList = orderQuery.Select(o => new ViewTicketDetail()
{
name = o.name,
activationTime = o.activationTime,
}).OrderBy(o => o.ActivationTime).Skip(pageIndex).Take(pageSize).ToList();
能对结果集的属性排序
2 根据条件选择排序字段
if (isuse==0)
{
var reList = orderQuery.OrderBy(o => o.loseTime).Select(o => new ViewTicketDetail()
{
name = o.name,
loseTime = o.loseTime==maxDataTmie?null:o.loseTime,
}).Skip(pageIndex).Take(pageSize).ToList();
}
if (isuse == 1)
{
var reList = orderQuery.OrderBy(o => o.activationTime).Select(o => new ViewTicketDetail()
{
name = o.name,
loseTime = o.loseTime==maxDataTmie?null:o.loseTime,
}).Skip(pageIndex).Take(pageSize).ToList();
}
2 可以在排序时设置默认值
OrderBy(o => o.loseTime.GetValueOrDefault(DateTime.MaxValue)).Skip(pageIndex).Take(pageSize).ToList();
3 合计金额报错解决
.Sum(od => (decimal?)od.Quantity).GetValueOrDefault();
4 排序不能设置默认值,但是查询可以设置默认值,改写
var orderQuery = (from ticket in MQuery
join wxpr in dbContext.wx_shop_product
on ticket.specialGoods equals wxpr.id
join Activation in dbContext.TicketActivation
on ticket.ID equals Activation.ticketid
into Activationtemp
from act in Activationtemp.DefaultIfEmpty()
join TicketLose in dbContext.TicketLose
on ticket.ID equals TicketLose.ticketid
into TicketLosetemp
from Lose in TicketLosetemp.DefaultIfEmpty()
join code in dbContext.msd_code.Where(w => w.wordsCode == "msd_useticket_isuse")
on ticket.isuse equals code.numberCode
select new
{
name = ticket.name,
activationTime = act.ActivationTime,
loseTime = Lose.loseTime==null ? maxDataTmie: Lose.loseTime,
isuse = code.codeName
var reList = orderQuery.Select(o => new ViewTicketDetail()
{
name = o.name,
activationTime = o.activationTime,
loseTime = o.loseTime,
isuse = o.isuse
}).OrderBy(o => o.loseTime).Skip(pageIndex).Take(pageSize).ToList();
returnModels = new PagedList2<ViewTicketDetail>(reList, pageIndex, pageIndex, totalItemCount);