var pageindex = new SqlParameter { ParameterName = "PageIndex", SqlDbType = SqlDbType.Int, Value = PageIndex };
var pagesize = new SqlParameter { ParameterName = "PageSize", SqlDbType = SqlDbType.Int, Value = PageSize };
var totalcount = new SqlParameter { ParameterName = "TotalCount", SqlDbType = SqlDbType.Int, Value = 0, Direction = ParameterDirection.Output }; ctx.Database.SqlQuery<Student>("Myproc @PageIndex,@PageSize,@TotalCount output", pageindex, pagesize, totalcount).ToList();
上述是指定存储过程及相关参数。下面为要执行的存储过程
问题来了:当页码(PageIndex)为1,页容量(PageSize)为10时,也就是要获取前十条的数据,用EF查询时查询出来的却是最后一条数据,与此同时在数据库中单独执行存储过程是能够取出前十条数据的!请问问题出在哪里?
补充:将存储过程中的如下
修改为
between 1 and 10
再用EF调用存储过程却能取到前十条数据。
这是为何?
会不会是这两个参数写反了!
哦觉得你这是最佳答案了,难怪我测试的时候是正确的
@稳稳的河: 嗯 你上边说测了没问题 那可能就是参数位置的事儿了!
@莫宇: 嗯,了解了,犯低级错误了,谢谢!
@稳稳的河: 谢谢回答!
@Recluse_Xpy: 哎...
没看出问题,你用窗口函数排序是OK的,你该看看EF传过来的PageIndex,PageSize的值到底是什么
用profiler监控传递过来的页码是1每页大小是10没错
@Recluse_Xpy: 怪异,下午我去测试下看看
@稳稳的河: 发图片你看
参数传递是正确的
@Recluse_Xpy: 所以我说奇怪呀
@稳稳的河: 不会是between and 的问题吧,改成t.RowIndex>(@PageIndex-1)*@PageSize and t.@RowIndex<=(@PageIndex)*@PageSize你先试试
用EF调用存储过程没什么,调用分页存储过程,是不太想得通
恩是的,最近在研究EF,所以在这里卡死了!
我也试过传分页参数的,以前没出现这个问题,不过不是用EF去传参数,下午去试试EF这样做会有什么问题,按道理profiler监控是传了1和10过去,为什么就执行有问题了
@稳稳的河: 静候佳音!!我也再研究研究
@Recluse_Xpy: 你也TOlist的,觉得也不会是延时加载的问题
@稳稳的河: 如果你不Tolist那怎么与数据库交互了,对吧
@稳稳的河: 谢谢回答
ParameterName = "@PageIndex"
ParameterName = "@PageSize"
ParameterName = "@TotalCount"
查出数据还是最后一条
@Recluse_Xpy: 你再把那个图截出来看看。
@Launcher: 谢谢回答
我想说你真可怜.这么麻烦而且还在查找错误.moon的分页:
人家是在学习,EF的分页一句代码完全搞定这一堆代码,根本不需要什么存储过程。
@沧海一杰: 是的,不过做表报很多数据的关联查询,得到报表结果,用EF这样写存储过程也是可行的