【问题标题】:How to optimize this expression ? LINQ?如何优化这个表达式?林克?
【发布时间】:2015-01-14 06:57:55
【问题描述】:

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

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

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

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

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

n.eventId != eventId - 对于编辑,我想排除正在编辑的记录,因为如果用户没有编辑学科而是其他内容,它仍然会返回行作为冲突

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

((n.eventEnd - 主要日期比较。也许它可以用一些 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 能给我一个更好的结果吗?我担心当数据库增长时会发生什么。

感谢您的帮助

【问题讨论】:

  • 只需添加一些换行符和空格,代码就可以了。唯一真正的问题是你试图把它全部塞进一条线上。虽然您可以做其他事情,但有效地添加空格可能“足够好”。
  • 每个 &amp;&amp; 之前的换行符并删除许多不必要的括号使其可读性好。查看order of operations
  • 就个人而言,我认为您处理此问题的方式是错误的。您为什么要向客户发送大量信息以验证数据?为什么不直接将参数发送到数据库上的存储过程,让数据库进行验证,然后向客户端返回一个位(布尔值)?这将更加高效、安全,并且您可以获得额外的好处,即无需更新应用程序即可维护验证方法(除非需要额外的参数)。

标签: c# mysql linq optimization


【解决方案1】:

由于您实际上并不需要记录,而只是想知道是否存在一条(或多条)记录,因此在许多情况下使用 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))

【讨论】:

  • 您可能还想阅读这个kobikobi.wordpress.com/2013/05/29/…,它会为您添加一个范围交集扩展方法,这可能会让您更具可读性。
  • 感谢您的回答,最好的做法是不获取记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
相关资源
最近更新 更多