【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());
时间: 2024-08-29 15:45:38

【EF框架】另一个 SqlParameterCollection 中已包含 SqlParameter。的相关文章

另一个SqlParameterCollection中已包含SqlParameter

一般情况下,我们定义的一个SqlParameter参数数组,如: SqlParameter[] parms =             {                new SqlParameter("@DateTime1", dtBegin),                new SqlParameter("@DateTime2", dtEnd)            }; 如果只给一个SqlCommand使用,这种情况的参数使用,不会出现异常,但如果该参数

判断一个数字中是否包含两个相同的子串并输出

功能:判断一个数字中是否包含两个相同的子串(字串长度至少大于等于2),并输出(仅输出第一次相同的子串) 1 package ren.laughing.test.problem; 2 3 import java.util.Scanner; 4 5 /** 6 * 功能:判断一个数字中是否包含两个相同的子串(字串长度至少大于等于2),并输出(仅输出第一次相同的子串) 7 * 8 * @author Laughing_Lz 9 * @time 2016年7月4日 10 */ 11 public cla

Java 高效检查一个数组中是否包含某个值

如何检查一个数组(未排序)中是否包含某个特定的值?在Java中,这是一个非常有用并又很常用的操作.同时,在StackOverflow中,有时一个得票非常高的问题.在得票比较高的几个回答中,时间复杂度差别也很大. 1.不同的实现方式 使用list 1 public static boolean useList(String[] arr, String targetValue) { 2 return Arrays.asList(arr).contains(targetValue); 3 } 使用se

一个数组中是否包含某个值

1.检查数组中是否包含特定值的四种不同方法1)使用List: public static boolean useList(String[] arr, String targetValue) { return Arrays.asList(arr).contains(targetValue);} 2)使用Set: public static boolean useSet(String[] arr, String targetValue) { Set<String> set = new HashSe

C# 一个数组中是否包含某个值 总结

总结N种方法,待补充完善 一. Array.IndexOf int id = Array.IndexOf(string[],"要查找的值"); if(id!=-1) 或写成 if(Array.IndexOf(string[],"要查找的值") >= 0) 二.IList ((IList)string[]).Contains"要查找的值") 三.Array.Exists if (Array.Exists(SetSelectIds, eleme

js判断一个dom中是否包含另一个dom的方法

首先,比较原始(蠢)的方法 function isChildOf(child, parent) { if(child && parent) { let parentNode = child.parentNode; while(parentNode) { if(parent === parentNode) { return true; } parentNode = parentNode.parentNode; } } return false; } 这里 while 中判断其实在实际情况我们

用JAVA写查询一个字符串中是否包含另外一个字符串以及出现的次数

package JAVA; import java.awt.List;import java.util.ArrayList;/** *  * @author 梁小鱼 * */public class MyTest { public static void main(String[] args) {  //查找字符串在目标字符串是否存在  Boolean isExit = IsExit("f","abfsdfsdkjl;fas;dlfsldf;asdfsdfaszdf"

oracle判断一个字符串中是否包含另外一个字符串

select * from a where instr(a,b)>0; 用于实现B字段是A字段中的某一部分的时候,要论顺序或者要相邻的字符. 如果想要不论顺序或者不相邻的字符时,定义函数可以实现: select * from a where instr(a,b)>0; 这个只能实现B字段是A字段中的某一部分的时候. 如果想要不论顺序或者不相邻的字符时,定义函数可以实现 create or replace function checks(v_a varchar2,v_b varchar) ret

判断一个字符串中是否包含另一个字符串(KMP、BF)

判断一个字符串是否是另一个字符串的子串,也就是strstr()函数的实现,简单的实现方法是BF算法. 1.BF算法 int BF(char *s, char *p){ if(s==NULL || p==NULL)return -1; int i=0; int j; while(i<strlen(s)){ j=0; while(s[i]==p[j] && j<strlen(p)){ i++; j++; } if(j==strlen(p))return i-j; i=i-j+1;