EntityFramework中LINQ To SQL的lumbda表达式的错误应用

来源:互联网 发布:视频监控软件破解版 编辑:程序博客网 时间:2024/06/11 07:02

前面写了一篇文章说使用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;

以上仅为个人看法,如果对你有帮助,那就谢天谢地了,如果您觉得很烂,就使劲在下面吐槽吧。

0 0
原创粉丝点击