如何正确处理系统.可为null<;T>;LinqToSql类的字段

本文关键字:LinqToSql gt 字段 lt 何正确 处理系统 可为 null | 更新日期: 2023-09-27 17:58:18

我有一个表,里面有一些可以为null的双字段。使用LinqToSQL尝试直接使用字段,我得到

参数类型System。Nullable不可分配给参数类型双

如何正确处理此问题?

如何正确处理系统.可为null<;T>;LinqToSql类的字段

问题与Linq无关。它与doubledouble?/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

有两种方法。

  1. 使用可以为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"];
        }
    }
    
  2. 在赋值周围编写一个包装,如果存在NULL,则选择一个安全的默认值。我喜欢在数据记录类之外使用一个扩展方法,并在那里放置一个SafeConvert方法。

您可以强制转换它:double yourVariable = (double)ValueFromDb,也可以只获取double?:double yourVaraible = ValueFromDb.Value的值。两者都是正确的。