如何优化这个表达式?林克?

How to optimize this expression ? LINQ?

它看起来很吓人,但它确实有效..现在我想找到一个更好的方法来实现它。

我有一个应用程序可以预订体育中心,有篮球场、网球场、排球场和足球场。当有人创建新的预订时,我想检查在用户选择的时间是否没有针对该学科(运动)的其他预订,或者当有人正在编辑 his/her 预订时,he/she 没有选择已经预定了比赛场地。

我统计了所有符合要求的记录。如果没有记录,我假设选定的时间和纪律不会与任何其他已选定的时间和纪律中断。如果有记录,则表示该设施在所选时间有预订

表 Discipline 和 Event 之间存在关系,因此通过我的代码可以找到:

n.Discipline.disciplineId == disciplineId - 所选学科的id号

n.eventId != eventId - 对于编辑,我想排除正在编辑的记录,因为如果用户不是在编辑纪律,而是在编辑其他内容,它仍然 returns 行作为冲突

n.eventStart.Day == eventStart.Day - 没有这个比较,返回其他日期但匹配时间的记录

(( n.eventEnd <= eventStart || eventStart <= n.eventStart)&&( n.eventEnd <= eventEnd || eventEnd <= n.eventStart)) - 主要日期比较。也许它可以替换为一些 between 语句,但我找不到如何在我的代码中使用它。

db.Events.Where(n => n.Discipline.disciplineId == disciplineId && (n.eventId != eventId) && (n.eventStart.Day == eventStart.Day) && (( n.eventEnd <= eventStart  || eventStart <= n.eventStart)&&( n.eventEnd <= eventEnd || eventEnd <= n.eventStart))))

有没有办法改进或优化这段代码? LINQ 能给我更好的结果吗?我担心数据库增长时会发生什么。

感谢您的帮助

由于您并不真正需要这些记录,而只是想知道一个(或多个)记录是否存在,因此在许多情况下使用 Any 将显着减少查询,在第一个匹配的记录上退出。

我还为您简化了范围相交检查。由于我们不再使用作为日期时间一部分的 .Day,结果应该能够从服务器而不是客户端返回,并且应该能够利用放置在这些字段上的任何索引。

if (db.Events.Any(n => n.Discipline.disciplineId == disciplineId 
   && (n.eventId != eventId) 
   && (n.eventStart <= eventEnd) 
   && (eventStart <= n.eventEnd)))

您也可以像这样用更 LINQish 的方式重写它,但它是一回事:

if (db.Events
   .Where(n=>n.eventId != eventId)
   .Where(n=>n.eventStart<=eventEnd)
   .Where(n=>eventStart<=n.eventEnd)
   .Any(n.Discipline.disciplineId==disciplineId))