C# 可空日期时间上的linq

C# 可空日期时间上的linq,c#,linq,C#,Linq,我有一个包含Time1和Time2的表(为了示例)。Time2允许空值 我有一个对象模型,我想让Time2为空;到目前为止,我有: public Class MyModel{ public DateTime Time1 {get;set;} public System.Nullable<DateTime> Time2 {get;set} } var MyQuery = ... select new MyModel() { Time2 = (a.

我有一个包含Time1和Time2的表(为了示例)。Time2允许空值

我有一个对象模型,我想让Time2为空;到目前为止,我有:

public Class MyModel{
   public DateTime Time1 {get;set;}
   public System.Nullable<DateTime> Time2 {get;set}
}
var MyQuery = ...
   select new MyModel()
   { 
      Time2 = (a.Time2)
这里我想知道是否应该使用SingleOrDefault运算符?它没有在智能意义上表现出来。然而,intellisense显示了几个其他选项,其中包括:HasValue、Value、GetValue或Default

有什么好的选择吗


谢谢

为什么您认为您应该为
系统上的集合项提供一个方法。可为空的

您将无法在此上使用
SingleOrDefault()

Time2=(a.Time2.HasValue?a.Time2.Value:null)


这就是您应该如何设置值或使其为null的方法。

这是因为Time2是一种可为null的类型。可为Null的类型始终具有value属性。如果您将线路修改为:

Time2 = (a.Time2).Value
然后按值后的句号,您将看到Intellisense弹出窗口


作为安全检查,在使用.value之前,您可能还需要检查a.Time2的值是否不为null。否则您将得到一个空引用异常

SingleOrDefault是泛型IEnumerable的扩展方法,如下所示

Time2 = a.Time2.HasValue ? a.Time.Value : null;

公共静态TSource SingleOrDefault(
这是(不可数的来源)

如果您有一些可为null的列表,您可以使用该方法,如果列表没有或有多个项,它将返回第一个值或抛出

//a list of Nullable<DateTime> with exactly 1 item
var listOfDates = new DateTime?[] { null };

var myDate = listOfDates.SingleOrDefault(); // myDate => ((DateTime?)null)

你能用DateTime吗?而不是System.Nullable.you确定包含System.Linq吗?如果是这样,请发布您的整个查询。您可以使用DateTime吗?而不是System.Nullable。在编写时,如果a.Time2是DateTime还是DateTime?,这没关系。我是否要用DateTime替换public System.null?在我的对象模型定义中?我该怎么做?我是否选择GetSingleOrDefault?@frenchie nothing,它将是值或null。您可能需要调用a.Time2().ValueOk上的
,所以我只写Time2=a.Time2.Value?当它为空时会引发异常吗?我在问号后面得到一个“System.DateTime和之间没有显式转换”,其中Time2定义为System.Nullable或DateTime?是的,您可以
这很明显有时候Time2会为空。我该怎么写这行?我将类型更改为DateTime?;这好吗?约会时间?是的,但我在问号后面得到一个“System.DateTime和之间没有显式转换”,Time2定义为System.Nullable或DateTime?像这样强制转换null:(DateTime?)nullOK,对于对象模型,我应该将其定义为System.Nullable还是DateTime?我得到一个“System.DateTime和”之间没有显式转换,就在将Time2定义为System.Nullable或DateTime的问号后面?按如下方式强制转换null:(DateTime?)nullI在任何地方都使用DateTime?表单。它更易于阅读,并且没有角括号伤害我的眼睛。如果我使用.Value,它将返回“System.DateTime”和“null”之间的“无隐式转换”。虽然它不使用.Value,但它仍然可以工作。5年后使用C#6。
DateTime? myNullDate = null;

DateTime myDate;
myDate = myNullDate ?? DateTime.Now; // myDate => DateTime.Now
myDate = myNullDate ?? default(DateTime); // myDate => DateTime.MinValue
myDate = myNullDate.GetValueOrDefault(DateTime.Now); // myDate => DateTime.Now
myDate = myNullDate.GetValueOrDefault(); // myDate => DateTime.MinValue