【EF框架】另一個 SqlParameterCollection 中已包含 SqlParameter。


查詢報表的時候需要通過兩次查詢取出數據。

第一次,用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());

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM