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

时间:2011-06-03 22:03:52

标签: c# .net nullable

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

  

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

如何正确处理?

4 个答案:

答案 0 :(得分:20)

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

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

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

    double? foo ;
    double  bar = foo.Value ;
    

    如果NullReferenceException为空(即Nullable<T>为false),则会抛出.HasValue

  • 你可以施展它:

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

    同样,如果Nullabl<T>为空,您将获得例外。

  • 如果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() ;
    }
    

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

答案 1 :(得分:9)

您可以使用

double value = theObject.TheProperty.GetValueOrDefault();

如果您有Nullable<T>,则需要T类型的值。这会将任何null规范化为默认值T,对于双精度值将为0.0。如果你想要一些其他而不是默认的东西,你可以用另一种方式解决它。

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

答案 2 :(得分:2)

有两种方法。

  1. 使用可以为空的类型,例如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方法。

答案 3 :(得分:-1)

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