C# 为什么我必须调用函数DataContext ExecuteMethodCall两次

C# 为什么我必须调用函数DataContext ExecuteMethodCall两次,c#,sql-server,linq-to-sql,C#,Sql Server,Linq To Sql,我正在使用LINQtoSQL执行SPs,但有几个SP出现了这个问题。我必须执行函数ExecuteMethodCall两次才能得到结果。第一个调用甚至不会转到SQL Server。我使用SQL事件探查器检查SP是否已执行,但我在事件探查器中得到以下信息: RPC:已完成exec sp_重置_连接 对ExecuteMethodCall的后续调用实际上执行SP并获取数据 [Function(Name="dbo.Example_SP_To_Get_List")] [ResultType(typeof(E

我正在使用LINQtoSQL执行SPs,但有几个SP出现了这个问题。我必须执行函数ExecuteMethodCall两次才能得到结果。第一个调用甚至不会转到SQL Server。我使用SQL事件探查器检查SP是否已执行,但我在事件探查器中得到以下信息:

RPC:已完成exec sp_重置_连接

对ExecuteMethodCall的后续调用实际上执行SP并获取数据

[Function(Name="dbo.Example_SP_To_Get_List")]
[ResultType(typeof(Example_SP_To_Get_List_getResult1))]
[ResultType(typeof(Example_SP_To_Get_List_getResult2))]
public IMultipleResults Example_SP_To_Get_List([Parameter(Name="SEARCH", DbType="VarChar(50)")] string sEARCH, [Parameter(Name="PAGE", DbType="VarChar(1)")] string pAGE, [Parameter(Name="ACTIVEFILTER", DbType="VarChar(4)")] string aCTIVEFILTER)
{
    //first invocation, returns nothing, does not even call the SP (SQL Profiler does not show the sp call)
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), sEARCH, pAGE, aCTIVEFILTER);

    //second time, it executes the SP and returns the result
    result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), sEARCH, pAGE, aCTIVEFILTER);
    return ((IMultipleResults)(result.ReturnValue));
}

请帮助我找出为什么这会发生在少数SP上,而其他SP工作正常。

如果SP返回多个结果集,则调用方函数必须按顺序获取所有结果集。在上面的例子中,SP返回了两个结果集,而我只获取了第二个结果集。 使用以下代码可以解决此问题:

var spResults = dbLayer.Example_SP_To_Get_List();

var result1 = spResults.GetResult<Example_SP_To_Get_List_getResult1>().ToList(); 
var result2 = spResults.GetResult<Example_SP_To_Get_List_getResult2>().ToList(); 
var spResults=dbLayer.Example_SP_To_Get_List();
var result1=spResults.GetResult().ToList();
var result2=spResults.GetResult().ToList();

不确定这是否是最好的方法,但它解决了我的问题。

那么你是说如果你注释掉第一个
ExecuteMethodCall
,该方法将不返回任何内容?@TyCobb是的,如果我注释第一行,它将不返回任何内容。向我们展示
ExecuteMethodCall
@TyCobb的代码,它是在DataContext类中定义的系统函数,因此我没有此函数的代码。根据
ExecuteMethodCall
文档的第一行:“此API支持.NET Framework基础结构,不打算直接从代码中使用。”我想还有其他更好的方法来调用存储过程。