c# - 使用 LINQ to Entities 生成不需要的请求

标签 c# sql performance linq linq-to-entities

为了优化方法,我会查看我的每一行代码以及每个生成的请求,以便最大限度地消除它们。我对以下部分有严重的怀疑:

一个计划包含多个项目。一个项目包含多个事件。我首先加载所有事件以备将来需要。正如预期的那样,这会在 Activities 表上生成“SELECT WHERE IN”请求

var planningProjectIds = p.PlanningProjects.Select(x => x.PlanningProjectId).ToList();
var planningActivities = _db.PlanningActivities.Where(x => planningProjectIds.Contains(x.PlanningProjectId));
var planningActivitiesArr = planningActivities.ToLookup(x => x.PlanningProjectId);

这是第一次尝试。以下代码生成不需要的请求(在日志行 9b 和 10 之间)

foreach (PlanningProject pp in p.PlanningProjects)
{
    // ...
    sw.WriteLine("9");
    pp.PlanningActivities = planningActivitiesArr[pp.PlanningProjectId].ToList();
    sw.WriteLine("9b");
    pp.PlanningActivities = pp.PlanningActivities.OrderBy(x => x.Position).ThenBy(x => x.PlanningActivityId).ToList();
    sw.WriteLine("10");
    // ...
}

这是第二次尝试。此代码不生成查询

foreach (PlanningProject pp in p.PlanningProjects)
{
    // ...
    sw.WriteLine("9");
    pp.PlanningActivities = planningActivitiesArr[pp.PlanningProjectId]
        .OrderBy(x => x.Position)
        .ThenBy(x => x.PlanningActivityId)
        .ToList();
    sw.WriteLine("10");
    // ...
}

你能告诉我这是什么原因吗?提前谢谢你;)

这是日志的摘录,我们可以在其中看到额外的请求

9b
Opened connection at 06/07/2017 10:22:15 +02:00

SELECT 
    [Extent1].[PlanningActivityId] AS [PlanningActivityId], 
    [Extent1].[FriendlyName] AS [FriendlyName], 
    [Extent1].[PlanningProjectId] AS [PlanningProjectId], 
    [Extent1].[ActivityId] AS [ActivityId], 
    [Extent1].[ScheduleID] AS [ScheduleID], 
    [Extent1].[Position] AS [Position]
    FROM [dbo].[PlanningActivities] AS [Extent1]
    WHERE [Extent1].[PlanningProjectId] = @EntityKeyValue1


-- EntityKeyValue1: '847' (Type = Int32, IsNullable = false)

-- Executing at 06/07/2017 10:22:15 +02:00

-- Completed in 7 ms with result: SqlDataReader



Closed connection at 06/07/2017 10:22:15 +02:00

10

如果我可以忘记有值(value)的细节来解决这个小问题,请不要犹豫告诉我 :)

最佳答案

在您的第一个 block 中,pp 仍然连接到数据库上下文,lazily load 也将如此。 PlanningActivities。如果您在单个查询中完成所有操作并使用 Include,您可能会获得更好的性能和更少的查询。加载子实体。例如:

var projects = _db.Plannings
    .Where(pl => pl.PlanningId == 1234)
    .PlanningProjects
    .Include(pl => pl.PlanningProjects
        .Select(pp => pp.PlanningActivities))
    .ToList();

关于c# - 使用 LINQ to Entities 生成不需要的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44943626/

相关文章:

java - 从sql数据库中删除行

mysql不同类型的公用表

java - 如何提高 Redisson 中 RMapCache 的性能

php - 使用 'preg_replace' 和具有多个索引的数组时是否会影响性能或其他一些负面因素?

c# - Windows IoT Web 浏览器

c# - 如何使用 .NET 4.5 Owin 对 LinkedIn 进行身份验证

c# - 在c# Visual Studio中的一个连接中创建多个mysql命令&where子句中的未知列

sql - Oracle SQL 中的日期之前

c# - .NET 5 中的 System.Text.Json 字段序列化未在 Swashbuckle API 定义中显示

java - Java中枚举的每个值的键值映射