2013-05-22 1 views
1

Проблемы

Учитывая следующее:LINQ для исключения SQL при преобразовании обнуляемого значения ненулевого, используя Преобразование

class MyClass 
{ 
    public DateTime DateTime { get; set; } 
} 

и Queryable, где MyTable.NullableDateTime является DateTime? сопоставлен с SQL datetime:

IQueryable<MyTable> table = //something 

Выполнение следующих условий создает исключение, если столбец NullableDateTime содержит NULL:

table.Select(row => new MyClass 
{ 
    DateTime = Convert.ToDateTime(row.NullableDateTime) 
}).ToArray(); 

Ошибка:

InvalidOperationException

The null value cannot be assigned to a member with type System.DateTime which is a non-nullable value type.

Что я Пробовал

  1. Глядя на сгенерированного SQL:

    CONVERT(DateTime,[t0].[NullableDateTime]) AS [NullableDateTime] 
    
  2. Выполнение запроса перед выполнение Select. Это работает вокруг проблемы, но я не хочу запускать ее на стороне клиента, чтобы обойти эту проблему.

  3. Использование row.GetDefaultValue() вместо Convert.ToDateTime. Это дает другую ошибку:

    SqlException

    The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

    Вызов GetDefaultValue метода преобразуется в следующем SQL:

    COALESCE([t0].[NullableDateTime],'1/01/0001 12:00:00 AM') AS [NullableDateTime] 
    
+2

Какой тип 'NullableDateTime'? Я предполагаю, что вы не можете изменить тип в базе данных ... –

+0

Это SQL 'datetime', сопоставленный с .NET' DateTime? '. – Sam

+1

Но почему 'MyClass.DateTime' не имеет значения NULL? Вы не нуждались бы в каком-либо преобразовании, если бы это было так. –

ответ

2

Возможно, вам нужно использовать ?? оператор с некоторым значением DateTime по умолчанию (но не default(DateTime), потому что это значение 1/01/0001 12:00:00 AM выходит за допустимые значения для типа даты и времени SQL. Вероятно, вы можете использовать SqlDateTime.MinValue.Value в правой части ??.

 Смежные вопросы

  • Нет связанных вопросов^_^