zoukankan      html  css  js  c++  java
  • 【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());
  • 相关阅读:
    记一次vue.js用 http.post 前端传json到后台用javabean接收的坑
    springboot1.5.x 测试sample
    sqlserver 查询表缺失索引
    Docker swarm上线的一些问题
    数据库日志文件压缩
    Docker 挂载
    单播广播和多播
    导入数据库表后某些字段的精度为0
    Source Qualifiter组件中Sql Query属性的脚本返回结果集的列数大于组件定义的数量
    distinct和order by冲突
  • 原文地址:https://www.cnblogs.com/wangdodo/p/7396119.html
Copyright © 2011-2022 走看看