如何优化此表达式?林克
本文关键字:表达式 林克 优化 何优化 | 更新日期: 2023-09-27 18:37:28
它看起来很可怕,但它有效......现在我想找到一种更好的方法来实现这一点。
我有一个应用程序,提供篮球,网球场,排球和足球的体育中心预订。当有人创建新预订时,我想检查在用户选择的时间是否没有该学科(运动)的其他预订,或者当有人编辑他/她的预订时,他/她没有选择已经预订的比赛场地。
我得到满足要求的所有记录的计数。 如果没有记录,我假设选定的时间和纪律不会中断任何其他已选择的时间和纪律。 如果有记录,则表示该设施在选定时间内存在预订
表纪律和事件之间存在关系,因此通过我的代码有:
n.Discipline.DisciplineId == disciplineId - 所选学科的 id 编号
n.eventId != eventId - 用于编辑 我想排除正在编辑的记录,因为如果用户没有编辑纪律但其他内容,它仍然返回行作为冲突
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 是 datetime 的一部分,结果应该能够从服务器而不是客户端返回,并且应该能够利用放置在这些字段上的任何索引。
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))