zoukankan      html  css  js  c++  java
  • 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中使用,则直接转化成为了日期类型的参数。

  • 相关阅读:
    【Oracle】ORA-00257:archiver error. Connect internal only, until freed 错误的处理方法
    【SQL】区分新来顾客和再访顾客
    【Xcelsius】在PPT中嵌入水晶易表Xcelsius2008仪表盘
    【SAP BO】【WEBI】【转】Webi实现动态选择度量
    【转】Xcelsius2008 水晶易表问题 部分汇总
    如何进行有效的需求调研
    实现数据仓库的七个步骤、七个禁忌、七种思路
    UTC日期转时间戳
    WIN10下命令行禁用编辑模式
    让socket端口不被子进程继承
  • 原文地址:https://www.cnblogs.com/tylertang/p/11277150.html
Copyright © 2011-2022 走看看