【问题标题】:How to skip incorrect DateAndTime format when retrieving data from the database从数据库中检索数据时如何跳过不正确的 DateAndTime 格式
【发布时间】:2021-02-28 17:31:29
【问题描述】:

我有一个包含数据行的表,其中一些 DateAndTime 数据不正确,当我检索数据时,我得到以下异常 Unable to convert MySQL date/time value to System.DateTime。很难编辑所有记录,但我想做的是跳过不正确的 DateAndTime 格式我该怎么做? 不正确的 DateAndTime 格式可能如下: 0000-00-00 00:00:00 我的模型如下:

   public class Orders
    {
        [Key]
        public int Id { get; set; }
        public string CreatedBy { get; set; }
        public DateTime CreatedDateTime { get; set; }
        public int? OrderNumber{ get; set; }
    }   

我的 LINQ 查询如下:

result = appContext.DatabaseContext.Orders.Where(a => a.Id != -1).ToList();

【问题讨论】:

  • 您可能无法跳过这些记录,但您可能想要做的是将日期读取为字符串,然后遍历您获得的内容并将这些记录复制到 DateTime成功进入最终集合。
  • 您可以通过在连接字符串中添加 convert zero datetime=True 来跳过 0000-00-00 值。它可以帮助您将这些值转换为DateTime.MinValue,之后您可以简单地使用 LINQ

标签: c# asp.net-mvc linq


【解决方案1】:

使 CreatedDateTime 可以为空 日期时间?

如果值可以转换,你得到日期,否则你得到空值。

【讨论】:

    【解决方案2】:

    唉,您忘了告诉我们您的 LINQ 是由不同的进程执行,例如数据库管理系统(作为 Queryable),还是由您的本地进程(作为 Enumerable)执行。

    没有可以将字符串解析为 DateTime 的可查询 LINQ 方法。您只能将Datetime.TryParse 用作可枚举。

    我的建议是将日期作为文本获取到本地进程,然后让本地进程执行 TryParse。如果您的数据已经是本地的(作为可枚举的),那么您可以绕过第一步。

    var result = dbContext.Orders
        .Where(order => ...)        // if you don't want all Orders
        .Select(order => new
        {
             Id = order.Id,
             OrderNumber = order.OrderNumber,
             CreatedBy = order.CreatedBy,
    
             OrderDateTxt = order.CreatedDateTime,  // the order creation data as text:
        })
    
        // move the selected data to local process, so you can use DateTime.TryParse
        .AsEnumerable()
    
        // Try to Parse, remember if could not parse
        .Select(order => 
        {
             if (DateTime.TryParse(order.OrderDateText, out DateTime parsedDate)
             {
                  // could parse the date: return a new Order object:
                  return new Order
                  {
                      Id = order.Id,
                      OrderNumber = order.OrderNumber,
                      CreatedBy = order.CreatedBy,
                      CreatedDateTime = parsedDate,
                  };
             }
             else
             {
                  // could not parse.
                  return null;
             }
        })
    
        // finally throw away the Orders that didn't parse:
        .Where(order => order = null);
    

    我跳过了每个无法解析的订单。如果您想要这些订单,例如知道您应该修理哪些订单:

    else
    {
        // or if you want some default value:
        return new Order
        {
            Id = order.Id,
            OrderNumber = order.OrderNumber,
            CreatedBy = order.CreatedBy,
            CreatedDateTime = defaultDateValue,     // some value defined outside the LINQ
        };
    });
    

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      相关资源
      最近更新 更多