【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());

 

转载于:https://www.cnblogs.com/wangdodo/p/7396119.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值