Как правильно работать с полями System.Nullable <T>классов LinqToSql? - PullRequest
5 голосов
/ 04 июня 2011

У меня есть таблица с несколькими обнуляемыми двойными полями.Работая с LinqToSQL, пытаясь использовать поле напрямую, я получаю

Тип аргумента System.Nullable не присваивается типу параметра double

Как правильно с этим справиться?1007 *

Ответы [ 4 ]

21 голосов
/ 04 июня 2011

Проблема не имеет ничего общего с Linq. Это связано с преобразованием между double и double? / Nullable<double>.

Неявное преобразование из double? в double не допускается:

double? foo ;
double  bar = foo ;
  • Вы можете напрямую ссылаться на двойное значение:

    double? foo ;
    double  bar = foo.Value ;
    

    Это выдаст NullReferenceException, если Nullable<T> равно нулю (то есть, .HasValue ложно).

  • Вы можете разыграть его:

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

    Опять же, вы получите исключение, если Nullabl<T> равно нулю.

  • Вы можете использовать оператор объединения нулей для назначения значения по умолчанию, если Nullable<T> равно нулю:

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

    Это, естественно, позволяет избежать проблемы NullReferenceException`.

  • Вы можете использовать троичный оператор в том же ключе, что и оператор объединения нулей:

    double? foo ;
    double  bar = ( foo.HasValue ? foo.Value : -2 ) ;
    
  • Наконец, вы можете использовать обычную условную логику, чтобы следовать альтернативному пути:

    double? foo ;
    double  bar ;
    
    if ( foo.HasValue )
    {
      doSomething(foo.Value) ;
    }
    else
    {
      doSomething() ;
    }
    

Это о вариантах. Что правильно? Не знаю. Зависит от вашего контекста.

9 голосов
/ 04 июня 2011

Вы можете использовать

double value = theObject.TheProperty.GetValueOrDefault();

Если у вас есть Nullable<T> и вам нужно значение типа T.Это нормализует любое значение null к значению по умолчанию T, которое будет равно 0,0 для двойного числа.Если вы хотите что-то отличное от значения по умолчанию, вы можете обойти это другим способом.

double value = theObject.TheProperty ?? 1d; // where 1 replaces any null
2 голосов
/ 04 июня 2011

Есть два подхода.

  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.

0 голосов
/ 04 июня 2011

Вы можете либо разыграть его: double yourVariable = (double)ValueFromDb, либо просто получить значение double?: double yourVaraible = ValueFromDb.Value. Либо правильно.

...