Linq-To-SQL多次访问数据库 [英] Linq-To-SQL Multiple Trips to the Database

查看:93
本文介绍了Linq-To-SQL多次访问数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图通过在一次数据库访问中包括子属性来使我的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的无知,但是突出显示的三行是否表示从客户端(我的代码)到服务器有三程往返?如果是这样,为什么? 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

解决方案

Linq-2-sql LoadWith不支持多个1:N关系.

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

Linq2SQl渴望通过多个DataLoadOptions加载

I'm trying to make my Linq-to-SQL query more efficient by including child properties in one trip to the DB. I started by trying various linq queries to accomplish this. The queries were getting complex, so I tried the LoadWith() option:

The constructor of my DAL class sets the LoadWith() settings:

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;
}

And here is the query I'm using:

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

    return record.Map();
}

When I debug and F10 on just the linq query (not the return), I get this output in SQL Profiler:

Pardon my ignorance of SQL Profiler, but do the three highlighted lines mean there were three round trips from the client (my code) to the server? If so, why? Will SQL Server ever execute multiple sp_executesql calls in one trip?

And since I thought LoadWith() would eliminate multiple calls, what am I doing incorrectly?

EDIT

Here are the three statements within 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

解决方案

Linq-2-sql LoadWith does not support multiple 1:N relationships.

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

Linq2SQl eager load with multiple DataLoadOptions

这篇关于Linq-To-SQL多次访问数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆