[英]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.