您的位置:首页 > 数据库

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

2016-07-08 07:50 399 查看
前面写了一篇文章说使用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;


以上仅为个人看法,如果对你有帮助,那就谢天谢地了,如果您觉得很烂,就使劲在下面吐槽吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linq to sql EF