如何正确处理系统.可为null<;T>;LinqToSql类的字段
本文关键字:LinqToSql gt 字段 lt 何正确 处理系统 可为 null | 更新日期: 2023-09-27 17:58:18
我有一个表,里面有一些可以为null的双字段。使用LinqToSQL尝试直接使用字段,我得到
参数类型System。Nullable不可分配给参数类型双
如何正确处理此问题?
问题与Linq无关。它与double
和double?
/Nullable<double>
之间的转换有关。
不允许从double?
到double
的隐式转换:
double? foo ;
double bar = foo ;
您可以直接引用双重值:
double? foo ; double bar = foo.Value ;
如果
Nullable<T>
为null(即.HasValue
为false),这将抛出一个NullReferenceException
。你可以施放:
double? foo ; double bar = (double) foo ;
同样,如果
Nullabl<T>
为null,您将得到一个异常。如果
Nullable<T>
为空,则可以使用空合并运算符来分配默认值: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>
,并且需要一个类型为T
的值时。这将使任何null
标准化为T
的默认值,对于双精度,该值将为0.0。如果你想要一些而不是默认的,你可以用另一种方式来解决它。
double value = theObject.TheProperty ?? 1d; // where 1 replaces any null
有两种方法。
-
使用可以为null的类型,如double?。您的实体类可以具有double的属性?并且您的客户端代码将使用可为null的类型。
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?
:double yourVaraible = ValueFromDb.Value
的值。两者都是正确的。