查询报表的时候需要通过两次查询取出数据。
第一次,用count(*)查出总数;
第二次,用rownumber分页取出想要的页内容;
为了防止sql注入,使用SqlParameter来传递参数
var param = new List<SqlParameter>(); param.Add(new SqlParameter("@StartTime", DateTime.Parse(req.StartTime))); param.Add(new SqlParameter("@EndTime", DateTime.Parse(req.EndTime)));
1
_ctx.Database.SqlQuery<int>(_sql, param.ToArray()).FirstOrDefault();
2
_ctx.Database.SqlQuery<ReceiveSummeryItem>(_sql, param.ToArray()).ToList();
但是第二次竟然报错:
另一个 SqlParameterCollection 中已包含 SqlParameter。
百度出来的一大堆结果都是给出的如下解决方案,然并卵
SqlCommand cmd = new SqlCommand(); using (SqlConnection conn = new SqlConnection(connDBStr)) { PrepareSqlCommand(cmd, conn, null, sql, cmdParms); SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable (SetSqlAsDataTableName(sql)); da.Fill(dt); cmd.Parameters.Clear();//多了这一句,就解决了问题 return dt; }
浪费感情。。。
只好用google搜索
最后在 stackoverflow 中发现了如下提问,真是如出一辙
代码优化成了clone之后好了。
_ctx.Database.SqlQuery<ReceiveSummeryItem>(_sql, param.Select(x => ((ICloneable)x).Clone()).ToArray()).ToList();
搞定!