Entity framework 4 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

我正在使用EF DbContext SqlQuery使用PagedList()获取分页对象的列表,出现以下错误:

“SqlParameter已包含在另一个SqlParameterCollection中”

以下是我的存储库代码:

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(…)时看到了完全相同的错误消息,其中my_type有一个
字符串
,但SQL语句为其中一个参数返回了一个
int


这个错误实际上是在返回映射中,但它说是SqlParameter造成的,这让我有点犹豫。

刚刚遇到了这个异常,尽管这是我第一次使用单个参数查询数据库。以及在“使用”中使用上下文。 当我将queryparameter“硬编码”到字符串中时,出于某种原因,它工作正常。但当我使用SqlParameter时,它给了我一个“SqlParameter已经被另一个SqlParameterCollection包含了”

这不起作用:

context.Database.SqlQuery(查询,新的SqlParameter(“@TableName”,TableName))

这确实:

context.Database.SqlQuery(查询,新的SqlParameter(“@TableName”,TableName))


区别在于返回类型
int?
vs
int
。所以对于任何读到这篇文章的人来说。请检查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);