【问题标题】:C# Only assign a datetime value if not NULLC# 如果不为 NULL,则仅分配日期时间值
【发布时间】:2018-10-18 10:40:04
【问题描述】:

我们有一个自定义对象,我正在尝试从数据集中分配和填充。除非日期时间字段中有 NULL 值,否则它工作正常。

这是对象示例:

public class Test
{

    public DateTime Date1{ get; set; }
    public DateTime Date2{ get; set; }
 }

我们想知道如何最好地通过解析分配任何值为 null 的值:

var convertedList = (from rw in ds.Tables[0].AsEnumerable()
    select new Test()
       {
          Date1 = Convert.ToDateTime(rw?["StartDate"]),
          Date2 = Convert.ToDateTime(rw?["EndDate"])
        }).ToList();

以下内容在 null 时抛出异常(应该如此)。只是想知道处理这个问题的最佳实践吗?请注意,由于外部应用程序,我们不能使用可为空的日期时间(日期时间?)。

理想情况下,如果为空,我们不希望指定日期时间

【问题讨论】:

  • Idealy, we would not want to assign the datetime if null 如果它不能为空,它需要某种形式的值(即使它只是MinValueMaxValue)。你希望它有什么价值?
  • 我们存储为日期,而不是可以为空的日期。问题是,结束日期有时不会在数据库中分配任何值。
  • 那么不需要调用Convert.ToDateTime(如果已经是DateTime)。你能回答我第一条评论中的问题吗?
  • we are storing as dates, just not nullable dates.如果不是数据库中可以为空的数据,rw?["StartDate"]如何返回null
  • 外部应用的约束是什么?可以不使用可以为空的 DateTime 类型,还是只有值为 null 时才有问题?您可以创建属性DateTime? 并实现get 以返回您选择的默认值(如果为空)。

标签: c# asp.net datetime


【解决方案1】:

您可能想要分配一些默认值,例如:

Date1 = rw?["StartDate"]==null?DateTime.MinValue:Convert.ToDateTime(rw?["StartDate"]);

或者只是忽略那些具有空值的:

var convertedList = (from rw in dt2.AsEnumerable() where rw["StartDate"] != null && rw["EnDate"] != null
    select new Test()
    {
        Date1 = (rw["StartDate"] == null ? Convert.ToDateTime(rw["StartDate"]) : new DateTime()),
        Date2 = (rw["EndDate"] == null ? Convert.ToDateTime(rw["EndDate"]) : new DateTime())
    }).ToList();

【讨论】:

    【解决方案2】:

    您可以检查 NULL 并替换为您想要的日期。

    var convertedList = (from rw in dt2.AsEnumerable()
        select new Test()
        {
            Date1 = (rw["StartDate"] == null ? Convert.ToDateTime(rw["StartDate"]) : new DateTime()),
            Date2 = (rw["EndDate"] == null ? Convert.ToDateTime(rw["EndDate"]) : new DateTime())
        }).ToList();
    

    【讨论】:

      【解决方案3】:

      你能不使用 DateTime.TryParse,它会尝试将字符串转换为 dateTime,但如果不能,它将使用 dateTime.minValue?

      【讨论】:

        【解决方案4】:

        您要对输入值进行完整性检查吗?如果是这样,我称之为“被动错误报告”的方法可能就是这样。

        INotifyDataErrorInfo 就是告诉用户问题 - 并允许您在提交之前检查是否有错误 - 无需“求助”异常。

        您经常在 WPF 中使用它,其中 ViewModel 可能需要接受可空值甚至数字字符串(出于完全查看原因),但模型不能接受 Null 值或解析整数以外的任何值。

        【讨论】:

          猜你喜欢
          • 2019-05-06
          • 1970-01-01
          • 2019-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多