EF框架另一个 SqlParameterCollection 中已包含 SqlParameter。
Posted 疯狂的小馒头
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 [email protected]"); // wh.Append(" and [email protected]"); 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());
以上是关于EF框架另一个 SqlParameterCollection 中已包含 SqlParameter。的主要内容,如果未能解决你的问题,请参考以下文章
EF框架搭建-使用Repository和UnitOfWorks