SqlParameter 已包含在另一个 SqlParameterCollection 中,但我不知道如何

SqlParameter is already contained by another SqlParameterCollection, but I don't see how

我有以下代码。

// Get total row count and build Pagination object
var countQuery = ArticleServerContext.Database.SqlQuery<int>("GetFullTextSearchCount @SearchTerm",
    new SqlParameter("@SearchTerm", fullTextQuery));
Pagination pagination = new Pagination(countQuery.Single(), page ?? 1);
// Get search results for current page
var resultsQuery = ArticleServerContext.Database.SqlQuery<ArticleSummary>("GetFullTextSearchResults @SearchTerm, @SkipRows, @TakeRows",
    new SqlParameter("@SearchTerm", fullTextQuery),
    new SqlParameter("@SkipRows", pagination.SkippedRows),
    new SqlParameter("@TakeRows", pagination.RowsPerPage));
// Build model
SearchResultsModel model = new SearchResultsModel
{
    SearchTerm = searchTerm.Trim(),
    Pagination = pagination,
    Results = resultsQuery.ToList()   // <=== Here's where the error happens
};

当我尝试枚举 resultsQuery 时,我收到以下错误消息。

The SqlParameter is already contained by another SqlParameterCollection.

此错误消息似乎很清楚,但我看不到我在哪里将 SqlParameter 添加到多个 anything。我唯一能想到的是两个调用的第一个参数是相同的。 C# 能否以某种方式组合它们?无论哪种方式,我都需要它们包含相同的数据。

谁能看到这里发生了什么?

编辑:

抱歉,这是一个调试问题。我有另一个问题阻止了我预期的结果。但是当我进入调试器并单步执行我的代码时,我得到了上面提到的错误。

似乎代码是使用有问题的 SqlParameter 执行的,然后我尝试检查查询的内容,查询再次使用相同的 SqlParameter那个是导致错误的原因。

不幸的是,现在我有赏金,我不能删除这个问题。

在定义之前清除参数:-

cmd.Parameters.Clear()

试试这个。而不是:

  var resultsQuery = ArticleServerContext.Database.SqlQuery<ArticleSummary>("GetFullTextSearchResults @SearchTerm, @SkipRows, @TakeRows",
    new SqlParameter("@SearchTerm", fullTextQuery),
    new SqlParameter("@SkipRows", pagination.SkippedRows),
    new SqlParameter("@TakeRows", pagination.RowsPerPage));
// Build model
SearchResultsModel model = new SearchResultsModel
{
    SearchTerm = searchTerm.Trim(),
    Pagination = pagination,
    Results = resultsQuery.ToList()   // <=== Here's where the error happens
};

使用:

      var results = ArticleServerContext.Database.SqlQuery<ArticleSummary>("GetFullTextSearchResults @SearchTerm, @SkipRows, @TakeRows",
    new SqlParameter("@SearchTerm", fullTextQuery),
    new SqlParameter("@SkipRows", pagination.SkippedRows),
    new SqlParameter("@TakeRows", pagination.RowsPerPage)).ToList();
// Build model
SearchResultsModel model = new SearchResultsModel
{
    SearchTerm = searchTerm.Trim(),
    Pagination = pagination,
    Results = results   // <=== Moved the call to ToList UP
};

延迟查询 执行是我不喜欢 EF 的另一个原因。通过向上移动 ToList() 调用,您将强制 EF 改为执行 立即执行。在您问题的更新中,您声明您的问题与 IDE 重新运行查询两次(导致重复参数异常)的调试问题有关。

但是,您可以通过绕过延迟查询执行并强制执行立即发生来避免调试问题,从而将变量 resultsQuery 的内容从等待调用的查询更改为实际结果集。

明确地说,移动 ToList() 调用会强制立即执行查询到您的变量 "resultsQuery",这会更改其内容(因此我更改了变量名称以反映其更改后的内容).该变量现在将保存查询的返回结果,而不是查询本身。因此,当您在执行暂停时枚举它时,您将枚举一个返回结果的静态列表,而不是重新运行查询。因此,这将防止抛出异常。

这也是为什么我在评论中说我从未发生过上述问题(除了我现在尽可能避开 EF 的事实)。

您可以在此处阅读有关 MSDN 的更多信息:

https://msdn.microsoft.com/en-us/library/bb738633%28v=vs.100%29.aspx?f=255&MSPPError=-2147217396

从上面的 link,Microsoft 声明:

要强制立即执行不产生单一值的查询,您可以调用 ToList 方法、ToDictionary 方法,或查询或查询变量上的 ToArray 方法。

当我发布这个问题时,我并没有很好地理解发生了什么。进一步研究后发现:

  1. 另一个问题导致我的程序没有显示我预期的(任何)结果。

  2. 使用 Visual Studio 调试器,我在这段代码中设置了一个断点。当我逐步执行时,正在执行查询。但是当我试图检查数据时,这导致再次执行查询。正是这种双重执行导致了我报告的错误。其实这个错误在代码运行正常的时候是不会出现的。

感谢所有花时间看这个问题的人。