在Linq-to-SQL中,IMultipleResults是否多次访问数据库?

时间:2013-03-06 06:01:21

标签: c# database linq linq-to-sql

我有一个存储过程如下:

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语句数(本例中为4)?

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

IMultipleResults results = context.SomeMethod(SomeID);

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

对于ToList个案例,读者将检索整个结果集。因此,如果有大量数据,则必然需要更长时间。