首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >该SqlParameter已被另一个SqlParameterCollection包含

该SqlParameter已被另一个SqlParameterCollection包含
EN

Stack Overflow用户
提问于 2013-03-09 16:34:16
回答 6查看 9K关注 0票数 0

我使用EF DbContext SqlQuery通过PagedList (https://github.com/TroyGoode/PagedList)获取分页对象的列表,并收到以下错误:

“该SqlParameter已被另一个SqlParameterCollection包含”

以下是我的存储库代码:

代码语言:javascript
运行
复制
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;

但是,当我在SqlQuery语句上调用ToList扩展时,它工作得很好:

代码语言:javascript
运行
复制
var userList = db.Database.SqlQuery<User>(sqlString, userIdParam).ToList();

PagedList代码:

代码语言:javascript
运行
复制
private PagedList(IQueryable<T> source, int pageIndex, int pageSize)
    {
        TotalItemCount = source.Count();

        PageSize = pageSize;
        PageIndex = pageIndex;
        PageCount = TotalItemCount > 0 ? (int)Math.Ceiling(TotalItemCount / (double)PageSize) : 0;

        HasPreviousPage = (PageIndex > 0);
        HasNextPage = (PageIndex < (PageCount - 1));
        IsFirstPage = (PageIndex <= 0);
        IsLastPage = (PageIndex >= (PageCount - 1));

        ItemStart = PageIndex * PageSize + 1;
        ItemEnd = Math.Min(PageIndex * PageSize + PageSize, TotalItemCount);

        // add items to internal list
        if (TotalItemCount > 0)
            Data = pageIndex == 0 ? source.Take(pageSize).ToList() : source.Skip((pageIndex) * pageSize).Take(pageSize).ToList();
    }

我已经有了下面的解决方案,但没有任何成功:

代码语言:javascript
运行
复制
var param = new DbParameter[] { new SqlParameter { ParameterName = "UserId", Value = userId }

我能做些什么来修复我遇到的错误?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-01-07 01:00:52

仅供参考,当使用EF 5 DbContext调用带有SqlParameters数组的context.ExecuteQuery<my_type>(...);时,我看到了完全相同的错误消息,其中my_type有一个string,但SQL语句返回其中一个参数的int

错误实际上是在返回映射中,但它说SqlParameter是罪魁祸首,这让我有一段时间感到困惑。

票数 4
EN

Stack Overflow用户

发布于 2014-07-15 20:29:49

在使用诸如db.Database.SqlQuery之类的对SqlQuery的通用调用时,您必须迭代到返回集的最后一条记录,以便释放结果集和相关参数。PagedList使用source.Take(pageSize).ToList(),它不会读到源集的末尾。您可以通过在返回结果之前执行诸如foreach(userList中的用户x)之类的操作来解决此问题。

票数 4
EN

Stack Overflow用户

发布于 2013-03-22 05:40:49

我在http://blogs.msdn.com/b/diego/archive/2012/01/10/how-to-execute-stored-procedures-sqlquery-in-the-dbcontext-api.aspx尝试了Diego Vega的以下解决方案,它对我很有效:

代码语言:javascript
运行
复制
 var person = context.Database.SqlQuery<Person>(
 "SELECT * FROM dbo.People WHERE Id = {0}", id);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15308804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档