我正在尝试检索开始日期和结束日期之间发生的计划列表。我有每个时间表的父记录和子记录列表。
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/