• EntityFramework 根据时间筛选数据


    需求:根据当前时间,获取条件合适的数据,其中截止时间只比较日期。

    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中使用,则直接转化成为了日期类型的参数。

  • 相关阅读:
    3.3 React Hooks
    ES6高阶函数
    ES6扩展运算符
    4.0不用npm,cnpm。使用yarn包启动react项目
    4.3 webpack打包学习
    4.2 Node.js模块化教程
    4.1React模块化
    vue组件化开发
    js箭头函数
    weblogic_exploit
  • 原文地址:https://www.cnblogs.com/tylertang/p/11277150.html
Copyright © 2020-2023  润新知