如何优化这个表达式? LINQ?

时间:2015-01-13 21:44:40

标签: c# mysql linq optimization

它看起来很可怕但它确实有效..现在我想找到一种更好的方法来实现它。

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

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

表Discipline和Event之间存在关系,因此我的代码是:

n.Discipline.disciplineId == disciplineId - 所选学科的身份证号码

n.eventId!= eventId - 用于编辑我想要排除正在编辑的记录,因为如果用户没有编辑纪律但是其他东西仍然会将行作为冲突返回

n.eventStart.Day == eventStart.Day - 如果没有此比较,则返回包含其他日期但匹配小时的记录

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

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可以给我一个更好的结果吗?我担心数据库增长时会发生什么。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

由于您并不真正需要记录,只是想知道是否存在一个(或多个)记录,因此使用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))