2014-08-28 4 views
8

У меня есть запрос LINQ, который должен получить некоторое значение DateTime. Иногда у меня нет соответствия, и мне нужно вернуть NULL для этого значения DateTime вместо значения по умолчанию для DateTime.Возврат null вместо значения по умолчанию в LINQ

Как я могу избежать этого и вернуть значение NULL вместо defaul?

Мой LINQ:

CreatedDate = ctaMatch.Select(d => d.CreatedDate).DefaultIfEmpty().FirstOrDefault() 

В DefaultIfEmpty я могу поставить только DateTime.

+2

У вас не может быть null DateTime, так как это тип значения. Вы можете использовать тип с нулевым значением ('DateTime?'). – Mephy

ответ

7

Отдайте его DateTime?, который приведет к созданию DefaultIfEmpty, создавая коллекцию по умолчанию, которая содержит пустое значение, если коллекция пуста.

CreatedDate = ctaMatch 
    .Select(d => (DateTime?)d.CreatedDate) 
    .DefaultIfEmpty() 
    .FirstOrDefault() 

PS:DefaultIfEmpty может быть опущен, так как это следует FirstOrDefault.

+1

Используя 'DefaultIfEmpty()', не делает ли это 'Default' в' FirstOrDefault() 'избыточным? Должно ли это быть 'First()'? – Sam

+0

@ Да, если за ним следует 'FirstOrDefault', это не требуется. –

7

Вы можете наложить на Nullable<DateTime>.

ctaMatch.Select(d => (DateTime?)d.CreatedDate).FirstOrDefault() 

... тем самым придав ему значение по умолчанию null.

+0

Простой. Любить это. – user1191559

3

Альтернативный синтаксис ... получить элемент First, если Any существует; в противном случае используют null:

DateTime? CreatedDate = ctaMatch.Any() ? ctaMatch.First().CreatedDate : (DateTime?)null; 
+0

Является ли последний литой необходимым? '(DateTime?)'. Если 'CreatedDate' имеет тип DateTime? то присваивание просто «null» выполняет задание. 'CreatedDate = ctaMatch.Any()? ctaMatch.First(): null; ' – broadband

+0

@broadband Если' CreatedDate' уже имеют тип 'DateTime?', тогда вы правы - приведение было бы ненужным. В случае с OP, 'CreatedDate' был недействительным' DateTime', поэтому значение по умолчанию было «1/1/0001», чего он не хотел. В этом случае бросок необходим. –

+0

Я полагаю, вы имеете в виду не-nullable 'DateTime' только' DateTime createdDate' (без '?' В конце 'DateTime'). Даже если CreateDate не имеет значения NULL, вы не можете назначить приложением DateTime. 'DateTime CreatedDate = (DateTime?) Null; не будет компилировать' – broadband

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