我有一个包含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。
关于什么是正确选择的任何想法?
由于
答案 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)
这就是你应该如何设置值或让它为空。