簡體   English   中英

在Linq-to-SQL中,IMultipleResults是否多次訪問數據庫?

[英]In Linq-to-SQL, does IMultipleResults hit the database more than once?

我有一個存儲過程如下:

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();

肯定只有一次數據庫往返。 LinqToSQL無法看到存儲過程中的內容,它必須依賴於您應用的ResultType屬性是否正確。

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

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

對於ToList情況,讀者將檢索整個結果集。 因此,如果有大量數據,則必然需要更長時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM