Исключение LINQ to SQL при преобразовании значения, допускающего значение NULL, в значение, не допускающее значения NULL, с помощью Convert

Проблема

Учитывая следующее:

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

и запрашиваемый, где MyTable.NullableDateTime - это DateTime?, сопоставленный с SQL datetime:

IQueryable<MyTable> table = //something

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

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

Ошибка:

InvalidOperationException

Нулевое значение не может быть присвоено члену с типом System.DateTime, который является типом значения, не допускающим значения NULL.

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

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

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

  3. # P9 #
    # P10 # # P11 #
    # P12 #
    COALESCE([t0].[NullableDateTime],'1/01/0001 12:00:00 AM') AS [NullableDateTime]
    

person Sam    schedule 22.05.2013    source источник
comment
Какой тип NullableDateTime? Я предполагаю, что вы не можете изменить тип в базе данных ...   -  person Gert Arnold    schedule 22.05.2013
comment
Это SQL datetime, сопоставленный с .NET DateTime?.   -  person Sam    schedule 22.05.2013
comment
Но почему MyClass.DateTime не допускает значения NULL? Если бы это было, вам не потребовалось бы никакого преобразования.   -  person Gert Arnold    schedule 22.05.2013
comment
@GertArnold, потому что я работаю над плохо написанным проектом кем-то другим, и от меня требуется внести минимальные изменения.   -  person Sam    schedule 22.05.2013
comment
Ах да, знакомо :). Я думаю, что ответ STO подойдет, за исключением того, что вы можете преобразовать нули в default(DateTime), потому что вы находитесь в .Net. Плохо то, что вам придется проверить DateTime.MinValue, где адрес MyClass.DateTime.   -  person Gert Arnold    schedule 22.05.2013
comment
@GertArnold, default(DateTime) не работает, потому что, как следует из принятого ответа, он выходит за пределы диапазона SQL datetime, поэтому при выполнении запроса он создает недопустимый SQL datetime.   -  person Sam    schedule 23.05.2013


Ответы (1)


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

person STO    schedule 22.05.2013