3

我有一个存储过程如下:

CREATE PROCEDURE GetMultipleResults
   @SomeID int
AS
BEGIN
   SELECT * FROM SomeTable1 where SomeColumn1 = @SomeID
   SELECT * FROM SomeTable2 where SomeColumn2 = @SomeID
   SELECT * FROM SomeTable3 where SomeColumn3 = @SomeID
   SELECT * FROM SomeTable4 where SomeColumn4 = @SomeID
END

然后我使用以下代码来执行和检索数据:

[Function(Name = "dbo.SPROCName")]
[ResultType(typeof(ResultSet1))]
[ResultType(typeof(ResultSet2))]
[ResultType(typeof(ResultSet3))]
[ResultType(typeof(ResultSet4))]
public IMultipleResults SomeMethod([Parameter(DbType = "INT")] int? SomeID
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), SomeID);
    return ((IMultipleResults)(result.ReturnValue));
}

现在最后,为了获得每个结果,我执行如下操作:

public void SomeOtherMethod(int SomeID)
{
    DataContext1 context = new DataContext1 (dbConnString);
    IMultipleResults results = context.SomeMethod(SomeID);

    ResultSet1 resultSet1= results.GetResult().FirstOrDefault();
    IEnumerable resultSet2 = results.GetResult().ToList();
    IEnumerable resultSet3 = results.GetResult().ToList();
    ResultSet4 resultSet4= results.GetResult().FirstOrDefault();
}

我的问题是,Linq-to-SQL 是否执行整个存储过程一次,然后GetResult()用于从内存中获取它,或者它是否执行 n 个查询(往返 db 调用),其中 n 是存储中的 select 语句数proc(本例中为 4)?

我问的原因是因为即使对于大数据,以下行几乎也需要相同的时间来执行:

IMultipleResults results = context.SomeMethod(SomeID);

但是在 resultSet3 是大量数据的情况下运行以下部分需要一些明显的时间:

IEnumerable resultSet3 = results.GetResult().ToList();
4

1 回答 1

4

到数据库肯定只有一次往返。LinqToSQL 无法看到存储过程中的内容,它必须依赖于您应用的 ResultType 属性是否正确。

在内部,LinqToSQL 将执行存储过程,然后打开数据读取器以检索结果。

对于这种FirstOrDefault情况,它将检索第一项(如果有的话),然后使用IDataReader.NextResult跳到下一个结果集。因此,即使 resultSet1 可能很大,也只有第一行需要通过网络获取。

对于这种ToList情况,阅读器将检索整个结果集。因此,如果有大量数据,则必然需要更长的时间。

于 2013-03-06T08:35:01.737 回答