眾所周知,在linq to entity的查詢語句中,不允許出現ef不能識別的關鍵字,如Trim,Substring,TotalDays等.net里的關鍵字,在EF查詢里都是不被支持的,它的原因可能是為了更好的提高查詢的性能吧,畢竟,好的性能取決於你的程序標准,有了一個嚴格的標准,才能設計出好的程序來.
今天主要說一下,EF為日期方法留的一個后門,<后門>這個詞大家在中國社會都應該知道了,顧名思義,就是反着原則走,你的原則對我沒有用,哈哈!這東西有時候是有用的,因為在大的原則下,很可能一些需求無法實現,這時,就需要后門了!
EF里的后門類:
System.Data.Objects.SqlClient.SqlFunctions
下面我們看一個例子,這個例子涉及到了一個根據時間的查詢
public System.Linq.Expressions.Expression<Func<Classroom_Live, bool>> SatisfiedBy() { Specification<Classroom_Live> spec = new TrueSpecification<Classroom_Live>(); if (_status.HasValue) { if (_status.Value == 0) spec &= new DirectSpecification<Classroom_Live>(o => (o.Status & (int)Status.AuditNotPass) > 0 || (o.Status & (int)Status.Auditing) > 0 || DateTime.Now < o.BeginTime); else if (_status == 1) spec &= new DirectSpecification<Classroom_Live>(o => (o.Status & (int)Status.AuditPass) > 0 && System.Data.Objects.SqlClient.SqlFunctions.DateDiff("mi", DateTime.Now, o.BeginTime) < o.Minutes); else spec &= new DirectSpecification<Classroom_Live>(o => (o.Status & (int)Status.AuditPass) > 0 && System.Data.Objects.SqlClient.SqlFunctions.DateDiff("mi", DateTime.Now, o.BeginTime) > o.Minutes); } return spec.SatisfiedBy(); }
下面是關於dataPart參數的說明,來自http://www.w3school.com.cn/sql/func_datediff.asp
| datepart | 縮寫 |
|---|---|
| 年 | yy, yyyy |
| 季度 | qq, q |
| 月 | mm, m |
| 年中的日 | dy, y |
| 日 | dd, d |
| 周 | wk, ww |
| 星期 | dw, w |
| 小時 | hh |
| 分鍾 | mi, n |
| 秒 | ss, s |
| 毫秒 | ms |
| 微妙 | mcs |
| 納秒 | ns |
