2012-08-08 41 views
2

我試圖通過在一次訪問數據庫時包含子屬性來使我的Linq-to-SQL查詢更高效。我開始嘗試各種linq查詢來完成此操作。這些查詢都拿到複雜,所以我嘗試了LoadWith()選項:Linq-To-SQL對數據庫的多次訪問

我DAL類的構造函數設置LoadWith()設置:

public TrackerJobData() 
{ 
    dataLoadOptions = new DataLoadOptions(); 

    dataLoadOptions.LoadWith<TrackerJobRecord>(x => x.SpecBarcodeRecords); 
    dataLoadOptions.LoadWith<TrackerJobRecord>(x => x.TrackerJobEquipmentTriggerRecords); 
    dataLoadOptions.LoadWith<TrackerJobRecord>(x => x.EtaRecord); 

    this.Database.LoadOptions = dataLoadOptions; 
} 

這裏是我使用的查詢:

public TrackerJob GetItem(int trackerJobId) 
{ 
    TrackerJobRecord record = 
     (from trackerJob in this.Database.TrackerJobRecords 
     where trackerJob.TrackerJobId == trackerJobId 
     select trackerJob).FirstOrDefault(); 

    return record.Map(); 
} 

當我調試,並在剛剛LINQ查詢(不返回)F10 ,我得到這個輸出在SQL事件探查器:

enter image description here

請原諒我對SQL事件探查器的無知,但是三條突出顯示的行意味着從客戶端(我的代碼)到服務器有三次往返?如果是這樣,爲什麼? SQL Server會在之間執行多個sp_executesql調用嗎?一個之旅?

因爲我認爲LoadWith()會消除多個調用,我做了什麼不正確?

編輯

這裏是SQL事件探查器中的三句話:

exec sp_executesql N'SELECT TOP (1) [t0].[TrackerJobId], [t0].[Name], [t0].[EtaId], [t0].[SamplingProcessorTypeId], [t0].[Description], [t0].[LastModifiedUser], [t0].[LastModifiedTime], [t0].[VersionNumber], [t0].[Active], [t0].[Archived], [t1].[EtaId] AS [EtaId2], [t1].[EtaNumber], [t1].[Title], [t1].[State], [t1].[DateInitialized], [t1].[EtaOriginatorId], [t1].[Quantity], [t1].[Ehs], [t1].[Ship], [t1].[InternalUse], [t1].[DateClosed], [t1].[ExperimentId], [t1].[Disposition], [t1].[TestType], [t1].[LastModifiedUser] AS [LastModifiedUser2], [t1].[LastModifiedTime] AS [LastModifiedTime2], [t1].[VersionNumber] AS [VersionNumber2] 
FROM [AutoTracker].[TrackerJob] AS [t0] 
INNER JOIN [Global].[Eta] AS [t1] ON [t1].[EtaId] = [t0].[EtaId] 
WHERE [t0].[TrackerJobId] = @p0',N'@p0 int',@p0=17 

exec sp_executesql N'SELECT [t0].[SpecBarcodeId], [t0].[TrackerJobId], [t0].[EquipmentId], [t0].[StartTime], [t0].[EndTime], [t0].[LastModifiedUser], [t0].[LastModifiedTime], [t0].[VersionNumber] 
FROM [AutoTracker].[SpecBarcode] AS [t0] 
WHERE [t0].[TrackerJobId] = @x1',N'@x1 int',@x1=17 

exec sp_executesql N'SELECT [t0].[TrackerJobId], [t0].[EquipmentId], [t0].[LastModifiedUser], [t0].[LastModifiedTime], [t0].[VersionNumber] 
FROM [AutoTracker].[TrackerJobEquipmentTrigger] AS [t0] 
WHERE [t0].[TrackerJobId] = @x1',N'@x1 int',@x1=17 
+0

你介意張貼正在執行的三個查詢? – 2012-08-08 17:30:06

+0

@JeffMercado完成。 – 2012-08-08 17:33:36

+0

何時以及如何初始化this.Database?你在構造函數中設置它的屬性,但我不明白它是如何設置的。 – 2012-08-08 17:57:27

回答

1

每個這樣的SQL事件探查器調用表示從客戶機到數據庫服務器實例中的一個往返。 SQL Server確實支持在一次往返中返回數據集,但我不確定如何使用LINQ to SQL來實現這一點。