需求:根据当前时间,获取条件合适的数据,其中截止时间只比较日期。
1. 运行会报错的版本:
var lifeWorkEventBatch = clientRepositoryContainer.LifeWorkEventBatchRepository.FindAll(lfe => lfe.SelectionStartTime <= DateTime.Now && lfe.SelectionEndTime >= DateTime.Now.Date).FirstOrDefault();
这里查资料得知:sql里面没有根据当前日期再获取Date的函数,因此不能转换成功,直接报错。
2.比较整个时间,不取出当前日期进行比较,有bug:
var lifeWorkEventBatch = clientRepositoryContainer.LifeWorkEventBatchRepository.FindAll(lfe => lfe.SelectionStartTime <= DateTime.Now && lfe.SelectionEndTime >= DateTime.Now).FirstOrDefault();
该linq转化为sql语句为:
SELECT [Extent1].[pkLifeWorkEventBatch] AS [pkLifeWorkEventBatch], [Extent1].[LifeWorkEventBatchCode] AS [LifeWorkEventBatchCode], [Extent1].[SelectionStartTime] AS [SelectionStartTime], [Extent1].[SelectionEndTime] AS [SelectionEndTime], [Extent1].[Status] AS [Status], [Extent1].[Description] AS [Description], [Extent1].[CreateOn] AS [CreateOn], [Extent1].[CreateBy] AS [CreateBy], [Extent1].[LastModifyOn] AS [LastModifyOn], [Extent1].[LastModifyBy] AS [LastModifyBy] FROM [dbo].[LifeWorkEventBatch] AS [Extent1] WHERE ([Extent1].[SelectionStartTime] <= (SysDateTime())) AND ([Extent1].[SelectionEndTime] >= (SysDateTime()))
3.实现需求的无错版本:
var dateTimeNow = DateTime.Now; var lifeWorkEventBatch = clientRepositoryContainer.LifeWorkEventBatchRepository.FindAll(lfe => lfe.SelectionStartTime <= dateTimeNow && lfe.SelectionEndTime >= dateTimeNow.Date).FirstOrDefault();
转化后的sql
exec sp_executesql N'SELECT [Extent1].[pkLifeWorkEventBatch] AS [pkLifeWorkEventBatch], [Extent1].[LifeWorkEventBatchCode] AS [LifeWorkEventBatchCode], [Extent1].[SelectionStartTime] AS [SelectionStartTime], [Extent1].[SelectionEndTime] AS [SelectionEndTime], [Extent1].[Status] AS [Status], [Extent1].[Description] AS [Description], [Extent1].[CreateOn] AS [CreateOn], [Extent1].[CreateBy] AS [CreateBy], [Extent1].[LastModifyOn] AS [LastModifyOn], [Extent1].[LastModifyBy] AS [LastModifyBy] FROM [dbo].[LifeWorkEventBatch] AS [Extent1] WHERE ([Extent1].[SelectionStartTime] <= @p__linq__0) AND ([Extent1].[SelectionEndTime] >= @p__linq__1)',N'@p__linq__0 datetime2(7),@p__linq__1 datetime2(7)',@p__linq__0='2019-07-31 12:52:40.5630849',@p__linq__1='2019-07-31 00:00:00'
从两次转化后的sql语句可以看出,先获取系统日期,再在linq中使用,则直接转化成为了日期类型的参数。