如何正确处理LinqToSql类的System.Nullable 字段?

我有一张桌子,里面有一些可以考虑的双字段。 使用LinqToSQL尝试直接使用该字段我得到

参数类型System.Nullable不能分配给参数类型double

我该如何正确处理?

这个问题与Linq无关。 它与doubledouble?之间的转换有关double? / Nullable

double?隐式转换double? 不允许double

 double? foo ; double bar = foo ; 
  • 您可以直接引用double值:

     double? foo ; double bar = foo.Value ; 

    如果Nullable为null(即.HasValue为false),则抛出NullReferenceException

  • 你可以施展它:

     double? foo ; double bar = (double) foo ; 

    同样,如果Nullabl为空,您将获得exception。

  • 如果Nullable为null,则可以使用null coalescing运算符指定默认值:

     double? foo ; double bar = foo ?? -1.0 ; 

    这个,natch,避免了NullReferenceException`问题。

  • 您可以使用与零合并运算符相同的三元运算符:

     double? foo ; double bar = ( foo.HasValue ? foo.Value : -2 ) ; 
  • 最后,您可以使用常规条件逻辑来遵循替代路径:

     double? foo ; double bar ; if ( foo.HasValue ) { doSomething(foo.Value) ; } else { doSomething() ; } 

这些是关于选项。 哪个是对的? 不知道。 取决于您的背景。

您可以使用

 double value = theObject.TheProperty.GetValueOrDefault(); 

当你有一个Nullable并且你需要一个T类型的值。 这会将任何null标准化为默认值T ,对于double,它将为0.0。 如果你想要一些非默认的东西,你可以用另一种方式解决它。

 double value = theObject.TheProperty ?? 1d; // where 1 replaces any null 

有两种方法。

  1. 使用nullable类型,如double?。 您的实体类可以具有double的属性? 并且您的客户端代码将使用可空类型。

     public class Person { public string FirstName { get; set; } public string LastName { get; set; } public double? Age { get; set; } public Person() { } public Person( IDataRecord record ) { FirstName = (string) record["first_name"]; LastName = (string) record["last_name"]; Age = (double?) record["age"]; } } 
  2. 如果存在NULL,则在分配周围编写一个包装器,选择安全的默认值。 我喜欢在数据记录类中使用扩展方法并在其中放置一个SafeConvert方法。

你可以double yourVariable = (double)ValueFromDb它: double yourVariable = (double)ValueFromDb或者你可以抓住double?的值double?double yourVaraible = ValueFromDb.Value 。 要么是正确的。