2

DBへの1回のトリップに子プロパティを含めることで、Linq-to-SQLクエリをより効率的にしようとしています。これを実現するために、さまざまなlinqクエリを試すことから始めました。クエリが複雑になったので、LoadWith()オプションを試しました。

私の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プロファイラーで次の出力が得られます。

ここに画像の説明を入力してください

SQL Profilerについての私の無知を許してください。しかし、強調表示された3行は、クライアント(私のコード)からサーバーへのラウンドトリップが3回あったことを意味しますか?もしそうなら、なぜですか?SQL Serverは、 1回のトリップで複数のsp_executesql呼び出しを実行することはありますか?

また、LoadWith()を使用すると複数の呼び出しがなくなると思ったので、間違って何をしているのでしょうか。

編集

SQLプロファイラー内の3つのステートメントは次のとおりです。

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
4

2 に答える 2

2

Linq-2-sqlLoadWithは、複数の1:N関係をサポートしていません。

http://weblogs.asp.net/zeeshanhirani/archive/2008/08/11/constraints-with-loadwith-when-loading-multiple-1-n-relationships.aspx

複数のDataLoadOptionsを使用したLinq2SQlの熱心なロード

于 2012-08-08T18:16:05.033 に答える
1

これらのSQLProfiler呼び出しはそれぞれ、クライアントからDBサーバーインスタンスへの単一のラウンドトリップを表します。SQL Serverは、1回のラウンドトリップでデータセットを返すことをサポートしていますが、LINQtoSQLを使用してそれをどのように行うかはわかりません。

于 2012-08-08T18:12:51.940 に答える