C# Linq到SQL多次访问数据库

C# Linq到SQL多次访问数据库,c#,sql-server,linq-to-sql,sql-server-profiler,C#,Sql Server,Linq To Sql,Sql Server Profiler,我试图通过在数据库的一次访问中包含子属性来提高Linq到SQL查询的效率。我首先尝试各种linq查询来实现这一点。查询变得越来越复杂,所以我尝试了LoadWith()选项: my DAL类的构造函数设置LoadWith()设置: public TrackerJobData() { dataLoadOptions = new DataLoadOptions(); dataLoadOptions.LoadWith<TrackerJobRecord>(x => x.

我试图通过在数据库的一次访问中包含子属性来提高Linq到SQL查询的效率。我首先尝试各种linq查询来实现这一点。查询变得越来越复杂,所以我尝试了LoadWith()选项:

my 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;
}
当我仅对linq查询(而不是返回)进行调试和F10时,我在SQL Profiler中得到以下输出:

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

请原谅我对SQL Profiler的无知,但这三行突出显示是否意味着从客户端(我的代码)到服务器有三次往返?若然,原因为何?SQL Server是否会在一次行程中执行多个sp_executesql调用

既然我认为LoadWith()可以消除多个调用,那么我做错了什么

编辑

以下是SQL Profiler中的三条语句:

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

这些SQL事件探查器调用中的每一个都表示从客户端到DB服务器实例的一次往返。SQL Server确实支持在一次往返中返回数据集,但我不确定如何使用LINQ to SQL实现这一点。

LINQ-2-SQL
LoadWith
不支持多个1:N关系


您介意发布正在执行的三个查询吗?
this.Database
何时以及如何初始化?您正在构造函数中设置它的属性,但我看不到它是如何设置的