0

PagedList ( https://github.com/TroyGoode/PagedList ) を使用してページ オブジェクトのリストを取得するために EF DbContext SqlQuery を使用していますが、次のエラーが発生します。

「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;

しかし、SqlQuery ステートメントで ToList 拡張機能を呼び出すと、正常に動作します。

var userList = db.Database.SqlQuery<User>(sqlString, userIdParam).ToList();

PagedList コード:

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();
    }

私はすでに以下の解決策を成功させていません:

var param = new DbParameter[] { new SqlParameter { ParameterName = "UserId", Value = userId }

発生しているエラーを修正するにはどうすればよいですか?

4

6 に答える 6

4

参考までに、EF 5 DbContext を使用して SqlParameters の配列を呼び出したときに、まったく同じエラー メッセージが表示されましcontext.ExecuteQuery<my_type>(...);た。stringint

エラーは実際にはリターン マッピングにありましたが、SqlParameter が原因であるとのことでした。

于 2016-01-06T17:00:51.783 に答える
1

http://blogs.msdn.com/b/diego/archive/2012/01/10/how-to-execute-stored-procedures-sqlquery-in-the-dbcontext-apiで Diego Vega から次のソリューションを試しました.aspxそしてそれは私のために働いた:

 var person = context.Database.SqlQuery<Person>(
 "SELECT * FROM dbo.People WHERE Id = {0}", id);
于 2013-03-21T21:40:49.363 に答える
0

(SqlQuery または ExecuteSqlCommand) でパラメーターを使用している場合、古いクエリが破棄されるまで、別のクエリでテーマを使用することはできません。PagedList メソッドでは、「source.Count();」を使用します。最初と最後の行で「ソース」を再度使用しています。それは正しくありません。あなたには2つの解決策があります。1- パラメータを PagedList メソッドに送信し、SqlQuery または ExecuteSqlCommand を使用してそれぞれの新しいテーマを送信します。 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))
        "
        ;
于 2015-10-25T20:59:19.283 に答える
0

単一のパラメーターを使用したデータベースへの最初のクエリであったにもかかわらず、この例外が発生しました。そして、コンテキストを「使用」します。queryparameter valies を文字列に「ハードコーディング」すると、何らかの理由で正しく機能しました。しかし、SqlParameter を使用するとすぐに、「SqlParameter は別の SqlParameterCollection に既に含まれています」というメッセージが表示されました。

これはうまくいきませんでした:

context.Database.SqlQuery<int?>(query, new SqlParameter("@TableName", tableName));

これは次のことを行いました:

context.Database.SqlQuery<int>(query, new SqlParameter("@TableName", tableName));

違いは、戻り値の型int?int. だから、これを読んでいる人のために。動作することが確実な場合でも、SqlQuery の戻り値の型を確認してください。

于 2017-06-15T10:18:44.773 に答える