【问题标题】:Linq-To-SQL Multiple Trips to the DatabaseLinq-To-SQL 多次访问数据库
【发布时间】:2012-08-09 02:16:05
【问题描述】:

我试图通过在一次访问数据库中包含子属性来提高我的 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 Profiler 中得到以下输出:

请原谅我对 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

【问题讨论】:

  • 您介意发布正在执行的三个查询吗?
  • this.Database 何时以及如何初始化?您在构造函数中设置它的属性,但我看不到它是如何设置的。
  • 基类处理:return (T)Activator.CreateInstance(typeof(T), new object[] { connectionString });

标签: c# sql-server linq-to-sql sql-server-profiler


【解决方案1】:
【解决方案2】:

每个 SQL Profiler 调用都代表从客户端到数据库服务器实例的一次往返。 SQL Server 确实支持在单次往返中返回数据集,但我不确定您将如何使用 LINQ to SQL 做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多