您的位置:首页 > 其它

VS2008下使用Linq To Entity的Skip().Take()分页查询时遇到数据结果不对的问题

2011-05-24 11:11 851 查看
昨晚上在使用VS2008下的Entity Framework处理分页查询时发现问题。

症状:

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为主键或者其它唯一值的字段,这不失是个好办法 !
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐