查詢報表的時候需要通過兩次查詢取出數據。
第一次,用count(*)查出總數;
第二次,用rownumber分頁取出想要的頁內容;
為了防止sql注入,使用SqlParameter來傳遞參數
List<SqlParameter> paramsList = new List<SqlParameter>(); //參數列表 paramsList.Add(new SqlParameter("@schSno", schSno));//校區 StringBuilder wh = new StringBuilder(); wh.Append(" and SchSno=@schSno"); // wh.Append(" and StuName1=@stuName"); var sqlStr = string.Format("select * from Student where 1=1 {0}", wh); var context = DAL.EFContextFactory.GetCurrentDbContext(); //數據查詢 var ret=context.Database.SqlQuery<Student >(sqlStr, paramsList.ToArray()).AsQueryable(); //第一次獲取總數 var total = ret.Count(); //第二次獲取分頁數據 var list = ret.OrderByDescending(x=>x.stuNo).Skip((pageIndex-1)*pageSize).Take(pageSize).Tolist();
然而第二次查詢的時候會報錯,提示
另一個 SqlParameterCollection 中已包含 SqlParameter。
網上的解決方案是
把
var ret=context.Database.SqlQuery<Student >(sqlStr, paramsList.ToArray()).AsQueryable();
改成
var ret = context.Database.SqlQuery<EnrLog_M>(sqlStr, paramsList.Select(x=> ((ICloneable)x).Clone()).ToArray()).AsQueryable();
然而並沒有用
除非是
var ret = context.Database.SqlQuery<EnrLog_M>(sqlStr, paramsList.Select(x=> ((ICloneable)x).Clone()).ToArray()).Tolist();
但這時候所以的數據都已經在內存里了,
不會再查數據庫了,所以使用Clone也是多余的。
目前沒有比較好的解決辦法,使用DbHelper,它內部也是實現了ToList()
var ret2 = DbHelper.ExcuteQuery<EnrLog_M>(sqlStr, CommandType.Text, paramsList.ToArray());