2013-03-06 66 views
3

我有一個存儲過程如下:在Linq-to-SQL中,IMultipleResults不止一次命中數據庫?

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到SQL執行一次整個存儲過程,那麼GetResult()用於從MEMOR得到它y,還是執行n個查詢(往返db調用),其中n是存儲過程中選擇語句的數量(本例中爲4)?

我問的原因是因爲以下行幾乎花費相同的時間量,即使對於大型數據執行:

IMultipleResults results = context.SomeMethod(SomeID); 

但以下用一些明顯的時候,哪裏運行resultSet3是大量的數據:

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

應該很容易找到:啓動SQL Server Profiler,並觀察應用程序和SQL Server之間的流量!我敢打賭,Linq-to-SQL將在一次調用中檢索**所有**結果集,然後僅返回您在客戶端請求的任何集合。 – 2013-03-06 06:14:32

+0

自SQL Server支持Multiple活動結果集 – 2013-03-06 06:16:26

回答

4

肯定只會有一個往返數據庫。 LinqToSQL沒有了解存儲過程中的內容,它必須依賴您應用的ResultType屬性是正確的。

內部LinqToSQL將執行存儲過程,然後打開數據讀取器來檢索結果。

對於FirstOrDefault個案,它將檢索第一個項目(如果有的話),然後使用IDataReader.NextResult跳到下一個結果集。因此,即使resultSet1可能很大,只有第一行需要通過網絡獲取。

對於ToList個案,整個結果集將由讀者檢索。所以如果有很多數據,它將需要更長的時間。