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

我有一个应用程序可以为体育中心提供预订,包括篮球,网球场,排球和足球。当某人正在创建新的预定时,我想检查用户选择的时间是否对该学科(运动)没有其他预定,或者当某人正在编辑其预定时,他/她没有选择已经预定的运动场。

我得到所有符合要求的记录的计数。如果没有记录,我认为所选的时间和纪律不会与其他已选择的中断。如果有记录,则表示在所选时间该设施存在预订

表Discipline和Event之间存在关系,因此请仔细阅读我的代码:

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

n.eventId!= eventId-用于编辑,我想排除正在编辑的记录,因为如果用户未在编辑学科,但由于其他原因,它仍会以冲突返回行

n.eventStart.Day == eventStart.Day-如果不进行比较,则返回其他日期但匹配时间的记录

(((n.eventEnd

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都会显着减少查询,并在第一个匹配的记录上退出。

我还为您简化了路口检查。由于不再使用datetime的.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))

关于c# - 如何优化此表达式? LINQ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27932069/

10-12 21:47