【问题标题】:Use DbFunctions to return the dateTime with mins included使用 DbFunctions 返回包含分钟的日期时间
【发布时间】:2020-03-14 19:59:26
【问题描述】:

我有以下代码,它会截断时间:

// does this already exist? 
var seekScan = (from s in aDb.Item_Scan_Event
                where s.item_detail_id == th_piece_id &&
                      s.scan_type == scantype &&
                      DbFunctions.TruncateTime(s.scan_datetime) == dt_scan.s.ScanDatetime.Date
                select s).FirstOrDefault();

我需要的是让它比较 dateTime 包括 HH:mm

我尝试过使用字符串比较之类的简单方法,但您不能在 Linq-to-Entities 中这样做:

var seekScan = (from s in aDb.Item_Scan_Event
                where s.item_detail_id == th_piece_id &&
                      s.scan_type == scantype &&
                      s.scan_datetime.Value.ToString("MM/dd/yyyy HH:mm") == dt_scan.s.ScanDatetime.ToString("MM/dd/yyyy HH:mm")
                select s).FirstOrDefault();

我得到的错误是:

LINQ to Entities 无法识别方法 'System.String ToString(System.String)' 方法,并且该方法无法转换为存储表达式。'

【问题讨论】:

  • 你不能用没有秒和毫秒的日期定义一个局部变量并在你的查询中使用它们吗?
  • 这是导致问题的比较左侧的部分(数据库部分)。我不知道怎么做你的建议?
  • 我不确定你到底在暗示什么,对不起。我明白了这个概念,但我想不出一种方法来编码?
  • 是的,我的错,想得不够远:/
  • 我认为这与 CreateTime 或其他东西有关....仍在努力。

标签: c# entity-framework-6


【解决方案1】:

简化Joe Ruder's answer 并使用DbFunctions 类:

var seekScan = (from s in aDb.Item_Scan_Event
        where
        s.item_detail_id == th_piece_id &&
        s.scan_type == scantype && (
        DbFunctions.TruncateTime(s.scan_datetime.Value).Value == dt_scan.s.ScanDatetime.Date &&
        DbFunctions.DiffMinutes(s.scan_datetime.Value, dt_scan.s.ScanDatetime) == 0 )
        select s
    ).FirstOrDefault();

更新

  1. 我们可以只使用DiffMinutes,除非它是完全相同的时间和不同的日子?

当你有相同的时间跨度但不同的日期时,它会失败。

  1. DiffMinutes 是否忽略日期部分?所以 11/11/2019 11:02 vs 11/12/2019 11:03 会是 1 吗?

我不确定它是返回日期和时间跨度之间的差异还是只是时间跨度,我已经很久没有使用它了。我猜你会测试它并告诉我们。

【讨论】:

  • 问题:这不会完全切断会议记录吗? DbFunctions.TruncateTime(s.scan_datetime.Value).Value -- ?我喜欢它,我只是想理解它。
  • 我想我明白了,第一行验证日期是否相同,第二行 && 条件查看是否存在分钟差异?
  • 所以我想我有两个问题:1. 我们可以只使用 DiffMinutes,除非它是完全相同的时间和不同的一天,否则它会起作用吗? 2. DiffMinutes 是否忽略日期部分?所以 11/11/2019 11:02 vs 11/12/2019 11:03 会是 1?
  • @JoeRuder 我用您要求的详细信息编辑了我的答案。
  • 我从午夜工作到中午,因为我的团队成员与我所在的国家不同。我会对其进行测试,并在我回来时通知您......谢谢
【解决方案2】:

当你定义一个 Datetime 类型的属性时,如果默认情况下没有为该属性定义属性,它将保存包括小时、分钟和秒在内的时间。

所以根据以下情况有一些用例:

场景 1:仅检查日/月/年

a) 对于日期时间

var loRecords = context.ORDERS.Where(x=>x.O_ORDER_TIME.Date.Equals(DateTime.Now.Date).ToList()

b) 日期时间?

 var loRecords = context.ORDERS.Where(x=>x.O_ORDER_TIME?.Date.Equals(DateTime.Now.Date).ToList()

场景 2:检查日/月/年小时和分钟

a) 日期时间

var loRecords = context.ORDERS.Where(x=>x.O_ORDER_TIME.Date.Equals(DateTime.Now.Date) 
&& x.O_ORDER_TIME.Date.Hour == DateTime.Now.Date.Hour
&& x.O_ORDER_TIME.Date.Minute == DateTime.Now.Date.Minute).ToList()

【讨论】:

    【解决方案3】:

    不优雅,但有效。

    //does this already exist?  Ignore items scanned within the same minute.
    var seekScan = (from s in aDb.Item_Scan_Event
            where
            s.item_detail_id == th_piece_id &&
            s.scan_type == scantype &&
            (s.scan_datetime.Value.Year == dt_scan.s.ScanDatetime.Year &&
            s.scan_datetime.Value.Month == dt_scan.s.ScanDatetime.Month &&
            s.scan_datetime.Value.Day == dt_scan.s.ScanDatetime.Day &&
            s.scan_datetime.Value.Hour == dt_scan.s.ScanDatetime.Hour &&
            s.scan_datetime.Value.Minute == dt_scan.s.ScanDatetime.Minute )
            select s
        ).FirstOrDefault();
    

    【讨论】:

      【解决方案4】:

      看看这个FUNCTION database.AddDays does not exist

      我要在 Mysql 中创建函数,也许您需要查看 bd 中的函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-20
        • 2023-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多