繁体   English   中英

如何正确处理 System.Nullable<t> LinqToSql 类的字段?</t>

[英]How to correctly deal with System.Nullable<T> fields of LinqToSql classes?

我有一个带有一些可以为空的双字段的表。 使用 LinqToSQL 尝试直接使用该字段我得到

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

我该如何正确处理?

该问题与Linq无关。 它与doubledouble? / Nullable<double>

double? 不允许double

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

     double? foo; double bar = foo.Value;

    如果Nullable<T>为 null(即.HasValue为假),这将引发NullReferenceException

  • 你可以投射它:

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

    同样,如果Nullabl<T>为 null,您将再次遇到异常。

  • 如果Nullable<T>为 null,您可以使用 null 合并运算符分配默认值:

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

    这自然避免了 NullReferenceException` 问题。

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

     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

有两种方法。

  1. 使用可空类型,例如 double?。 您的实体 class 可以具有 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 存在,则围绕选择一个安全默认值的分配编写一个包装器。 我喜欢使用数据记录 class 的扩展方法并在那里放置一个 SafeConvert 方法。

您可以将其转换为: double yourVariable = (double)ValueFromDb或者您可以只获取double? double yourVaraible = ValueFromDb.Value 要么是正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM