如何正确处理LinqToSql类的System.Nullable 字段?
我有一张桌子,里面有一些可以考虑的双字段。 使用LinqToSQL尝试直接使用该字段我得到
参数类型System.Nullable不能分配给参数类型double
我该如何正确处理?
这个问题与Linq无关。 它与double
和double?
之间的转换有关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
有两种方法。
-
使用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"]; } }
-
如果存在NULL,则在分配周围编写一个包装器,选择安全的默认值。 我喜欢在数据记录类中使用扩展方法并在其中放置一个SafeConvert方法。
你可以double yourVariable = (double)ValueFromDb
它: double yourVariable = (double)ValueFromDb
或者你可以抓住double?
的值double?
: double yourVaraible = ValueFromDb.Value
。 要么是正确的。