c# - 有什么办法可以让这个查询更快吗?

标签 c# linq

我正在尝试检索开始日期和结束日期之间发生的计划列表。我有每个时间表的父记录和子记录列表。

Schedule
  Id

ScheduleDates
  ScheduleId
  Start
  End

最终目标是能够显示分组的日期列表。因此,如果我有多个在同一天开始并在同一天结束的计划,则应将它们分组在一起。

Jan 10 - 15
  - Schedule 1
  - Schedule 2
Jan 10 - 20
  - Schedule 3
  - Schedule 4
Feb 1 - 3
  - Schedule 5

第一个查询看起来像这样:

var schedules = from schedule in _db.Schedules
                join date in _db.ScheduleDates on schedule.Id equals date.ScheduleId
                // join a bunch of other tables
                // bunch of where queries
                && date.Start >= startDate
                && date.Start <= endDate
                select schedule;

这会返回我想要的记录,我的问题是当我需要按最早和最新的子记录将记录分组在一起时。其余的都无所谓。

尝试添加以下作品

group new {
  //
} by new { 
   Start = schedule.ScheduleDates.Min(x=>x.Start),
   End = schedule.ScheduleDates.Max(x=>x.Start)
}

它只是效果不佳。当我有几千条记录时,速度非常慢,因为它基本上是对每一行使用以下 where 子句执行查询:

WHERE (((@x1 IS NULL) AND (((
    SELECT MIN([t4].[StartDate])
    FROM [dbo].[ScheduleDate] AS [t4]
    WHERE [t4].[ScheduleDate_ScheduleId] = [t1].[ScheduleId]
    )) IS NULL)) OR ((@x1 IS NOT NULL) AND (((
    SELECT MIN([t5].[StartDate])
    FROM [dbo].[ScheduleDate] AS [t5]
    WHERE [t5].[ScheduleDate_ScheduleId] = [t1].[ScheduleId]
    )) IS NOT NULL) AND (((@x1 IS NULL) AND (((
    SELECT MIN([t6].[StartDate])
    FROM [dbo].[ScheduleDate] AS [t6]
    WHERE [t6].[ScheduleDate_ScheduleId] = [t1].[ScheduleId]
    )) IS NULL)) OR ((@x1 IS NOT NULL) AND (((
    SELECT MIN([t7].[StartDate])
    FROM [dbo].[ScheduleDate] AS [t7]
    WHERE [t7].[ScheduleDate_ScheduleId] = [t1].[ScheduleId]
    )) IS NOT NULL) AND (@x1 = ((
    SELECT MIN([t8].[StartDate])
    FROM [dbo].[ScheduleDate] AS [t8]
    WHERE [t8].[ScheduleDate_ScheduleId] = [t1].[ScheduleId]
    ))))))) AND (((@x2 IS NULL) AND (((
    SELECT MAX([t9].[StartDate])
    FROM [dbo].[ScheduleDate] AS [t9]
    WHERE [t9].[ScheduleDate_ScheduleId] = [t1].[ScheduleId]
    )) IS NULL)) OR ((@x2 IS NOT NULL) AND (((
    SELECT MAX([t10].[StartDate])
    FROM [dbo].[ScheduleDate] AS [t10]
    WHERE [t10].[ScheduleDate_ScheduleId] = [t1].[ScheduleId]
    )) IS NOT NULL) AND (((@x2 IS NULL) AND (((
    SELECT MAX([t11].[StartDate])
    FROM [dbo].[ScheduleDate] AS [t11]
    WHERE [t11].[ScheduleDate_ScheduleId] = [t1].[ScheduleId]
    )) IS NULL)) OR ((@x2 IS NOT NULL) AND (((
    SELECT MAX([t12].[StartDate])
    FROM [dbo].[ScheduleDate] AS [t12]
    WHERE [t12].[ScheduleDate_ScheduleId] = [t1].[ScheduleId]
    )) IS NOT NULL) AND (@x2 = ((
    SELECT MAX([t13].[StartDate])
    FROM [dbo].[ScheduleDate] AS [t13]
    WHERE [t13].[ScheduleDate_ScheduleId] = [t1].[ScheduleId]
    )))))))

对此我能做些什么吗?

最佳答案

将逻辑转移到 C# 代码可能会更容易 - 不必使用 SQL。

因此,首先在数据库中查询您需要的最小数据集。然后编写一些 C# 来操作数据并根据您的要求对其进行分组。

SQL 不是通用编程语言!

关于c# - 有什么办法可以让这个查询更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8716312/

相关文章:

c# - ASP MVC4上传文件没有表单但有部分 View

c# - 一起运行两个 parallel.foreach()

c# - 减少纬度和经度点数量的最快方法

c# 这个设计是 "Correct"吗?

c# - Visual Studio 2022 .razor 代码块闪烁

c# - 在父子关系中具有多个对象的 Linq 查询

C# super 花哨的 LINQiness

c# - 在树结构中通过 ID 属性定位实例

c# - 为特定 id c# 插入新的 xml 节点

c# - Linq 递归搜索