VS2008下使用Linq To Entity的Skip().Take()分页查询时遇到数据结果不对的问题
2011-05-24 11:11
851 查看
昨晚上在使用VS2008下的Entity Framework处理分页查询时发现问题。
症状:
1、在翻页到4页之后,4-最后一页数据都是相同,PageSize,Start,Limit等分页参数通过跟踪检查都无误。
2、若直接点击最后一页,再向前翻,本是每页显示16条数据的变成了每页只有两条纪录,而且每页的数据也相同。
跟踪分页查询代码:
跟踪发现,count 为211,start,limit值都无误,但查询结果始终不正确。在我当时是按CreateTime字段进行Order by的,后来发现数据库中CreateTime的值有200条都相同,基本上确实是由于CreateTime的值相同产生了这个查询问题,改为order by UserName字段后,问题解决。
更深的原因或者解决方案还没有来得及研究。先纪录在案了,哎~~
更新:
建议使用Order by CreateTime desc,Id desc的方式排序,ID为主键或者其它唯一值的字段,这不失是个好办法 !
症状:
1、在翻页到4页之后,4-最后一页数据都是相同,PageSize,Start,Limit等分页参数通过跟踪检查都无误。
2、若直接点击最后一页,再向前翻,本是每页显示16条数据的变成了每页只有两条纪录,而且每页的数据也相同。
跟踪分页查询代码:
public List<T> PageList(IQueryable<T> query, int start, int limit, string sort, string dir, out int count) { IQueryable<T> result = query.Select(e => e); if (string.IsNullOrEmpty(sort)) throw new Exception("使用此方法,必须指定排序字段!"); ParameterExpression param = Expression.Parameter(typeof(T), "it"); Expression body = param; if (Nullable.GetUnderlyingType(body.Type) != null) body = Expression.Property(body, "Value"); PropertyInfo sortProperty = typeof(T).GetProperty(sort, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); if (sortProperty == null) throw new Exception("对像上不存在" + sortProperty + "的字段"); body = Expression.MakeMemberAccess(body, sortProperty); LambdaExpression keySelectorLambda = Expression.Lambda(body, param); string queryMethod = dir == "DESC" ? "OrderByDescending" : "OrderBy"; result = result.Provider.CreateQuery<T>(Expression.Call(typeof(Queryable), queryMethod, new Type[] { typeof(T), body.Type }, result.Expression, Expression.Quote(keySelectorLambda))); count = result.Count(); if (start >= 0 && limit > 0) result = result.Skip(start).Take(limit); return result.ToList();
跟踪发现,count 为211,start,limit值都无误,但查询结果始终不正确。在我当时是按CreateTime字段进行Order by的,后来发现数据库中CreateTime的值有200条都相同,基本上确实是由于CreateTime的值相同产生了这个查询问题,改为order by UserName字段后,问题解决。
更深的原因或者解决方案还没有来得及研究。先纪录在案了,哎~~
更新:
建议使用Order by CreateTime desc,Id desc的方式排序,ID为主键或者其它唯一值的字段,这不失是个好办法 !
相关文章推荐
- 使用Linq查询数据进行分页时遇到的性能问题
- MVC中使用Linq To Sql进行数据查询及分页
- 步步为营VS 2008 + .NET 3.5(6) - LINQ查询操作符之Distinct、Union、Concat、Intersect、Except、Skip、Take、SkipWhile、TakeWhile、Single、SingleOrDefaul
- 步步为营VS 2008 + .NET 3.5(6) - LINQ查询操作符之Distinct、Union、Concat、Intersect、Except、Skip、Take、SkipWhile、TakeWhile、Single、SingleOrDefault、Reverse、SelectMany
- 6、步步为营VS 2008 + .NET 3.5(6) - LINQ查询操作符之Distinct、Union、Concat、Intersect、Except、Skip、Take、SkipWhile、TakeWhile、Single、SingleOrDefault、Reverse、SelectMany
- 步步为营VS 2008 + .NET 3.5(6) - LINQ查询操作符之Distinct、Union、Concat、Intersect、Except、Skip、Take、SkipWhile、TakeWhile、Single、SingleOrDefaul
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- union all 和where条件一起使用查询数据不对的问题
- 关于linq to sql调用存储过程,出现"无法枚举查询结果多次"的问题
- 步步为营VS 2008 + .NET 3.5(8) - DLINQ(LINQ to SQL)之面向对象的添加、查询、更新和删除
- 遇到的问题----java jsp做数据分页翻页时遇到 java.lang.Integer cannot be cast to java.lang.String
- Linq to XML 排序,分页,多节点查询数据
- NHibernate初学者指南(15):使用LINQ to NHibernate提供程序查询数据
- linq to entity中遇到的问题
- 步步为营VS 2008 + .NET 3.5(9) - DLINQ(LINQ to SQL)之执行SQL语句的添加、查询、更新和删除
- mysql 设计遍历查询结果中的每行数据遇到的诸多问题
- linq to entity 查询数据表是错误解决
- Linq:使用Take和Skip实现分页
- 步步为营VS 2008 + .NET 3.5(8) - DLINQ(LINQ to SQL)之面向对象的添加、查询、更新和删除
- Linq to Sql 或linq to entities 与SQL查询结果不一致 返回重复结果问题