linq在可空的日期时间

时间:2011-03-09 20:49:44

标签: 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.Time2)

在这里我想知道我是否应该使用SingleOrDefault操作符?它没有在intellisense中显示。除此之外,intellisense还展示了其他几个选项,其中包括:HasValue,Value,GetValueOrDefault。

关于什么是正确选择的任何想法?

由于

4 个答案:

答案 0 :(得分:8)

那是因为Time2是一个可以为空的类型。可空类型始终具有值属性。如果您将行修改为:

Time2 = (a.Time2).Value

然后按下Value后的句点符号,你会看到Intellisense弹出。

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

答案 1 :(得分:4)

SingleOrDefault是通用IEnumerable的扩展方法,如下所示。

public static TSource SingleOrDefault( this IEnumerable source)

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

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

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

这可能不是你想要的,当你为null时你需要一些值,那么你应该使用C#3.0的coalesce运算符或者来自Nullable&lt;&gt;的GetValueOrDefault方法的重载之一。类型。

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

为什么你认为你应该在System.Nullable<DateTime>的某个东西上拥有一个集合项目的方法。

你不会有SingleOrDefault()

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

这就是你应该如何设置值或让它为空。