Entity framework 4 SqlParameter已包含在另一个SqlParameterCollection中
我正在使用EF DbContext SqlQuery使用PagedList()获取分页对象的列表,出现以下错误: “SqlParameter已包含在另一个SqlParameterCollection中” 以下是我的存储库代码:Entity framework 4 SqlParameter已包含在另一个SqlParameterCollection中,entity-framework-4,dbcontext,sqlparameter,pagedlist,Entity Framework 4,Dbcontext,Sqlparameter,Pagedlist,我正在使用EF DbContext SqlQuery使用PagedList()获取分页对象的列表,出现以下错误: “SqlParameter已包含在另一个SqlParameterCollection中” 以下是我的存储库代码: var db = (DbContext)DataContext; const string sqlString = @" WITH UserFollowerList
var db = (DbContext)DataContext;
const string sqlString =
@"
WITH UserFollowerList
AS
(
SELECT uf.FollowId
FROM UserFollow uf
WHERE uf.UserId = @UserId
)
SELECT * FROM UserFollowerList uf
INNER JOIN [User] u ON uf.FollowId = u.UserId
WHERE IsDeleted = 0
"
;
var userIdParam = new SqlParameter("UserId", SqlDbType.Int) {Value = userId};
var userList =
db.Database.SqlQuery<User>(sqlString, userIdParam)
.ToPagedList(pageIndex, pageSize);
return userList;
我能做些什么来修复我遇到的错误?我尝试了Diego Vega在的以下解决方案,它对我有效:
var person = context.Database.SqlQuery<Person>(
"SELECT * FROM dbo.People WHERE Id = {0}", id);
var person=context.Database.SqlQuery(
“从dbo.People中选择*,其中Id={0}”,Id);
使用对SqlQuery的一般调用(如db.Database.SqlQuery)时,必须迭代到返回集的最后一条记录,才能释放结果集和相关参数。PagedList使用source.Take(pageSize).ToList(),它不会读取到源集的末尾。在返回结果之前,您可以通过执行类似于foreach(userList中的用户x)的操作来解决此问题。当您在(SqlQuery或ExecuteSqlCommand)上使用参数时,在旧查询被释放之前,您不能通过另一个查询使用主题。
在PagedList方法中,首先使用“source.Count();”,然后再次使用“source”。那是不对的。
你有两个解决方案。
1-使用SqlQuery或ExecuteSqlCommand将参数发送到PagedList方法和每个方法的新主题
2-删除PagedList并将分页参数发送到SqlQuery或ExecuteSqlCommand,如下所示:
const string sqlString =
@"
WITH UserFollowerList
AS
(
SELECT uf.FollowId,ROW_NUMBER() OVER(ORDER BY uf.FollowId ) RowID
FROM UserFollow uf
WHERE uf.UserId = @UserId
)
SELECT * FROM UserFollowerList uf
INNER JOIN [User] u ON uf.FollowId = u.UserId
WHERE IsDeleted = 0 and RowID BETWEEN (((@PageNumber- 1) *@PageSize)+ 1) AND (@PageNumber * @PageSize))
"
;
仅供参考,我在使用EF5DBContext调用
context.ExecuteQuery(…)时看到了完全相同的错误消息带有SqlParameters数组的code>,其中my_type有一个字符串
,但SQL语句为其中一个参数返回了一个int
这个错误实际上是在返回映射中,但它说是SqlParameter造成的,这让我有点犹豫。刚刚遇到了这个异常,尽管这是我第一次使用单个参数查询数据库。以及在“使用”中使用上下文。
当我将queryparameter“硬编码”到字符串中时,出于某种原因,它工作正常。但当我使用SqlParameter时,它给了我一个“SqlParameter已经被另一个SqlParameterCollection包含了”
这不起作用:
context.Database.SqlQuery(查询,新的SqlParameter(“@TableName”,TableName))代码>
这确实:
context.Database.SqlQuery(查询,新的SqlParameter(“@TableName”,TableName))代码>
区别在于返回类型int?
vsint
。所以对于任何读到这篇文章的人来说。请检查SqlQuery的返回类型,即使您确定它应该工作。这是旧的,但我遇到了相同的问题,有人在这里想到了解决方案
基本上,为了获得分页查询,您需要将其拆分为几个步骤
//step 1 set the page numbers
int pageNumber = 1;
int pageSize = 2;
//step 2 set your parameters up
var parm2 = new SqlParameter("param1", "Kevin");
var parm1 = new SqlParameter("param1", "Kevin");
var pageParm = new SqlParameter("@p2", (pageNumber - 1) * pageSize);
var pageSizeParm = new SqlParameter("@p3", pageSize);
//step 3 split your queries up into search and count
var sqlString = @"SELECT FT_TBL.*
FROM EquipmentMaintenances AS FT_TBL
INNER JOIN FREETEXTTABLE(vw_maintenanceSearch, Search, @param1) AS KEY_TBL ON FT_TBL.EquipmentMaintenanceID = KEY_TBL.[KEY]
WHERE FT_TBL.Status = 1
ORDER BY RANK DESC, FT_TBL.EquipmentMaintenanceID DESC OFFSET @p2 ROWS FETCH NEXT @p3 ROWS ONLY";
var sqlCountString = @"SELECT COUNT(1)
FROM EquipmentMaintenances AS FT_TBL
INNER JOIN FREETEXTTABLE(vw_maintenanceSearch, Search, @param1) AS KEY_TBL ON FT_TBL.EquipmentMaintenanceID = KEY_TBL.[KEY]
WHERE FT_TBL.Status = 1
";
//step 4 run your queries c# doesn't like the reusing of parameters so create 2 (e.g Kevin) so your results will run correctly.
var main = _db.Database.SqlQuery<EquipmentMaintenance>(sqlString, parm1, pageParm, pageSizeParm).ToList();
var count = _db.Database.SqlQuery<int>(sqlCountString, parm2).FirstOrDefault();
//step 5 created your paged object - I'm using x.pagedlist
var paged = new StaticPagedList<EquipmentMaintenance>(main, pageNumber, pageSize, count);
//步骤1设置页码
int pageNumber=1;
int pageSize=2;
//第2步设置参数
var parm2=新的SqlParameter(“param1”、“Kevin”);
var parm1=新的SqlParameter(“param1”、“Kevin”);
var pageParm=新的SqlParameter(“@p2”,pageNumber-1)*pageSize);
var pageSizeParm=new-SqlParameter(“@p3”,pageSize);
//步骤3:将查询分为搜索和计数
var sqlString=@“选择FT\u TBL*
来自设备维护,如FT\U TBL
内部连接FREETEXTTABLE(vw_maintenanceSearch,Search,@param1)作为FT_TBL.EquipmentMaintenanceID=KEY_TBL上的KEY_TBL。[KEY]
其中FT_TBL.Status=1
按等级描述排序,FT_TBL.EquipmentMaintenanceID描述偏移量@p2行仅取下@p3行”;
var sqlCountString=@“选择计数(1)
来自设备维护,如FT\U TBL
内部连接FREETEXTTABLE(vw_maintenanceSearch,Search,@param1)作为FT_TBL.EquipmentMaintenanceID=KEY_TBL上的KEY_TBL。[KEY]
其中FT_TBL.Status=1
";
//第4步运行查询c#不喜欢重复使用参数,因此创建2(例如Kevin),以便正确运行结果。
var main=_db.Database.SqlQuery(sqlString,parm1,pageParm,pageSizeParm).ToList();
var count=_db.Database.SqlQuery(sqlCountString,parm2).FirstOrDefault();
//步骤5创建了分页对象-我正在使用x.pagedlist
var paged=新的静态页面列表(主、页码、页面大小、计数);
很明显,您现在正在将其传递回视图或其他函数以供显示。您看到和了吗?是的,我看到了,但两者都没有帮助解决我的问题。如果有人有更好的解决方案,我仍然希望尝试。我在生成的数据库第一个数据层时遇到了相同的错误。错误显示“SqlParameter已包含在另一个SqlParameterCollection中。”但实际上,如果直接在Sql Managament Studio中执行该过程,则会出现日期时间参数转换错误。
var person = context.Database.SqlQuery<Person>(
"SELECT * FROM dbo.People WHERE Id = {0}", id);
const string sqlString =
@"
WITH UserFollowerList
AS
(
SELECT uf.FollowId,ROW_NUMBER() OVER(ORDER BY uf.FollowId ) RowID
FROM UserFollow uf
WHERE uf.UserId = @UserId
)
SELECT * FROM UserFollowerList uf
INNER JOIN [User] u ON uf.FollowId = u.UserId
WHERE IsDeleted = 0 and RowID BETWEEN (((@PageNumber- 1) *@PageSize)+ 1) AND (@PageNumber * @PageSize))
"
;
//step 1 set the page numbers
int pageNumber = 1;
int pageSize = 2;
//step 2 set your parameters up
var parm2 = new SqlParameter("param1", "Kevin");
var parm1 = new SqlParameter("param1", "Kevin");
var pageParm = new SqlParameter("@p2", (pageNumber - 1) * pageSize);
var pageSizeParm = new SqlParameter("@p3", pageSize);
//step 3 split your queries up into search and count
var sqlString = @"SELECT FT_TBL.*
FROM EquipmentMaintenances AS FT_TBL
INNER JOIN FREETEXTTABLE(vw_maintenanceSearch, Search, @param1) AS KEY_TBL ON FT_TBL.EquipmentMaintenanceID = KEY_TBL.[KEY]
WHERE FT_TBL.Status = 1
ORDER BY RANK DESC, FT_TBL.EquipmentMaintenanceID DESC OFFSET @p2 ROWS FETCH NEXT @p3 ROWS ONLY";
var sqlCountString = @"SELECT COUNT(1)
FROM EquipmentMaintenances AS FT_TBL
INNER JOIN FREETEXTTABLE(vw_maintenanceSearch, Search, @param1) AS KEY_TBL ON FT_TBL.EquipmentMaintenanceID = KEY_TBL.[KEY]
WHERE FT_TBL.Status = 1
";
//step 4 run your queries c# doesn't like the reusing of parameters so create 2 (e.g Kevin) so your results will run correctly.
var main = _db.Database.SqlQuery<EquipmentMaintenance>(sqlString, parm1, pageParm, pageSizeParm).ToList();
var count = _db.Database.SqlQuery<int>(sqlCountString, parm2).FirstOrDefault();
//step 5 created your paged object - I'm using x.pagedlist
var paged = new StaticPagedList<EquipmentMaintenance>(main, pageNumber, pageSize, count);