2011-03-09 35 views
1

我有一个表有Time1和Time2(为了举例)。 Time2允许空值。可空日期时间的LINQ

我有一个对象模型,我希望有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,GetValueOrDefault。

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

感谢

+1

您可以使用DateTime吗?而不是System.Nullable 。 – 2011-03-09 20:51:34

+0

你确定你已经包含了System.Linq吗?如果是这样,请发布您的整个查询。 – 2011-03-09 20:51:58

+0

你可以使用DateTime吗?而不是System.Nullable 。如果a.Time2是日期时间或日期时间,那么在写入时就可以了。 – xanatos 2011-03-09 20:52:35

回答

6

这是因为Time2是可为空的类型。可为空的类型始终有一个值属性。如果你修改你的行:

Time2 = (a.Time2).Value 

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

作为安全检查,您可能还希望在使用.Value之前检查a.Time2的值是否为空。否则,您将获得空参考例外

+0

有时候,Time2将是空的。我应该如何写这行?我将类型更改为DateTime?这个好吗? – frenchie 2011-03-09 20:57:38

+0

DateTime?相当于可为空。 – 2011-03-09 21:05:17

+0

Mike C的建议是编写该行的好方法。 – 2011-03-09 21:06:34

1

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

对此,您不会有SingleOrDefault()

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

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

+0

那我该怎么办?我是否选择GetSingleOrDefault? – frenchie 2011-03-09 20:55:26

+0

@frenchie什么也没有,它可以是Value或null。您可能需要在a.Time2()上调用'Value'值 – msarchet 2011-03-09 20:57:06

+0

好吧,我只是写了Time2 = a.Time2.Value?当它为空时会抛出异常吗? – frenchie 2011-03-09 20:58:57

3
Time2 = a.Time2.HasValue ? a.Time.Value : null; 
+0

好的,对于对象模型,我是否应该将其定义为System.Nullable 或DateTime? – frenchie 2011-03-09 21:02:31

+2

在Time2被定义为System.Nullable 或DateTime的问号之后,我收到“System.DateTime和之间没有明确的转换”? – frenchie 2011-03-09 21:08:17

+2

投下这样的null:(DateTime?)null – 2011-03-09 21:23:04

3

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

public static TSource SingleOrDefault( this IEnumerable source)

如果你有可空的一些列表,你可以使用该方法,它会返回第一个值,或将引发列表有没有或一个以上的项目。

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

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

这可能不是你想要什么,你想要一些值,当它为空,那么你应该使用的C#3.0或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