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

13 篇文章 0 订阅

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值