2011-06-03 50 views
5

我有一个表有一些可空的双字段。与LinqToSQL工作试图用现场直接,我得到如何正确处理LinqToSql类的System.Nullable <T>字段?

参数类型System.Nullable不分配给参数类型双

如何处理这是否正确?

+0

这真的和LINQ无关。考虑一个更通用的SO搜索来处理Nullable值。 – 2011-06-03 22:17:48

+3

你应该真的发布实际的代码以及实际的错误信息。请不要让我们猜你正在尝试做什么。 – Gabe 2011-06-03 22:24:17

回答

18

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

double?double隐式转换是不允许的:

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

    double? foo ; 
    double bar = foo.Value ; 
    

    ,这将抛出一个NullReferenceException如果Nullable<T>为空(即.HasValue为false)。

  • 你可以将它转换:

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

    同样,你会得到一个异常,如果Nullabl<T>为null。

  • 可以使用空合并运算符来指定一个默认值,如果Nullable<T>为null:

    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

您可以投它:double yourVariable = (double)ValueFromDb或者您可以获取double?的值:double yourVaraible = ValueFromDb.Value。两者都是正确的。

+2

而且两者都可能爆炸*。考虑'double v = nullabledouble ?? somedefaultdouble',例如'double age = nullableAge ?? Double.NaN'(是的,我计算在这几天的小数年内;-) – 2011-06-03 22:15:22

+0

请确保您使用第二个版本,通过检查空值合并运算符'空值'是否为空值 – Sung 2011-06-03 22:15:38

7

您可以使用

double value = theObject.TheProperty.GetValueOrDefault(); 

当你有一个Nullable<T>,你需要T类型的值。这将正常化任何null到的T的默认值,这将是用于双0.0。如果你想要的东西其他比默认,你可以解决它的另一种方式。

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

+1?和'GetValueOrDefault' – 2011-06-03 22:19:33

2

有两种方法。

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