您的位置:首页 > 其它

【项目实战】--仅对 LINQ to Entities 中已排序的输入支持方法“Skip”。必须在调用“Skip”方法之前调用方法“OrderBy”

2017-07-13 20:06 525 查看

【前言】:

对LINQ自己之前仅仅是做项目维护的过程中有所了解,具体的也不太懂,在目前的一个项目开发中应用到了linq,这次是自己真真实实的去写,尽管刚开始的时候很不熟悉,在写的过程中对它的了解慢慢多了,看来项目实战对人的成长还是很有帮助的。

【问题描述】:

在进行分页查询的时候遇到如下问题——“仅对 LINQ to Entities 中已排序的输入支持方法“Skip”。必须在调用“Skip”方法之前调用方法“OrderBy” ”,到底是什么原因呢?

【原因分析】:

原因在于Linq默认查询出来的数据顺序是聚集索引的顺序,所以要加上排序操作。即用OrderBy或OrderByDescending即可。

【代码示例】:

public object GetAlarmInfo(int PrjID, int VolunGroup, int Volun, string AlarmStyle, int DoStatus, int page, int rows)
{
Con_Database db = new Con_Database();

var queryAll = (from a in db.AlarmData_BasicPhysiologicalIndexes
join b in db.Business_R_Project_Volunteer on a.VolunteerID equals b.VolunteerID
join c in db.Base_VolunteerGroup on b.VolunteerGroupID equals c.AutoID
join d in db.Business_VolunteerInfo on b.VolunteerID equals d.AutoID
select new { PrjID = a.PrjID,VolunteerID=a.VolunteerID, Name = d.Name,VolunteerGroupID=b.VolunteerGroupID, Gourp = c.Name, IndicatorCode = a.IndicatorCode, IndicatorValue = a.IndicatorValue, StartTime = a.StartTime, LowerLimit = a.LowerLimit, UpperLimit = a.UpperLimit, DoStatus=a.DoStatus }).Distinct();

if (PrjID != 0)
{
queryAll = queryAll.Where(a => a.PrjID == PrjID);
}
if (Volun != 0)
{
queryAll = queryAll.Where(a => a.VolunteerID == Volun);
}
if (VolunGroup!=0)
{
queryAll = queryAll.Where(a => a.VolunteerGroupID == VolunGroup);
}
if (AlarmStyle!="0")
{
queryAll = queryAll.Where(a =>a.IndicatorCode == AlarmStyle);
}
if (DoStatus!=2)
{
queryAll = queryAll.Where(a =>a.DoStatus == DoStatus);
}

Int32 iCount = queryAll.Count();
queryAll = queryAll.OrderByDescending(m => m.VolunteerID).Skip((page - 1) * rows).Take(rows);

var json = new
{
total = iCount,
rows = queryAll.ToList()
};
return queryAll;
}


【总结】:

在项目中不断的实践,从一点一滴的小问题入手,不断积累,站在巨人的肩膀上不断前行。小编的总结可能不是很详细,希望能给大家带来一些帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: