前面写了一篇文章说使用lumbda表达式写好查询条件,然后在linq中使用
Func<DB.Task, bool> query = (m) => m.AssignDate.HasValue && q.startDate.Date == m.AssignDate.Value.Date;
var list = bt.Task.Where(query).ToList();
当时这样用的最大的好处就是,m.AssignDate.Value.Date
可以使用而不报错。而最大的问题也就出现在这里。用SQL Server Profiler抓了一下请求的sql语句,大吃一惊,请求的数据等价于
select * from Task --has no Where /(ㄒoㄒ)/~~
果断的加了10W条数据,网站不负重望成了屎状,如果sqlserver不在本机的话,计算带宽更是扯了个DAN了。
而如果把query
的内容直接放到Where
里面,就会报错,原因就是Date不能用。
var list = bt.Task.Where((m) => m.AssignDate.HasValue && System.Data.Entity.DbFunctions.DiffDays(q.startDate, m.AssignDate) >= 0).ToList();
用EF提供的方法进行日期的判断就不会报错
Func<DB.Task, bool> query = (m) => m.AssignDate.HasValue && System.Data.Entity.DbFunctions.DiffDays(q.startDate, m.AssignDate) >= 0;
恩,又报错了,说DbFunctions
不能在linq外使用。
Expression<Func<DB.Task, bool>> query = (m) => m.AssignDate.HasValue && System.Data.Entity.DbFunctions.DiffDays(q.startDate, m.AssignDate) >= 0;
这样可以了,说实话,我已经被里面的泛型弄晕了。
Expression的命名空间:
using System.Linq.Expressions;
以上仅为个人看法,如果对你有帮助,那就谢天谢地了,如果您觉得很烂,就使劲在下面吐槽吧。