2009-04-22 36 views
10

tengo el siguiente LINQ consulta:valor nulo no se puede asignar - pregunta consulta LINQ

DataClassesDataContext dc = new DataClassesDataContext(); 
var query = from contact in dc.Contacts 
      select new 
      { 
       ContactId = contact.ContactId, 
       LastName = contact.LastName, 
       FirstName = contact.FirstName, 
       Addresses = contact.Addresses, 
       Phones = contact.Phones, 
       DOB = contact.BirthDate, 
       LastNote = contact.Notes.Max(n => n.Created), //this line causes the error 
       Status = contact.ContactStatus.ContactStatusName, 
       EmailAddress = contact.Emails 
      }; 

La línea donde consigo la fecha máxima creado para la colección de notas hace que la siguiente excepción a ser lanzado:

Excepción: El valor nulo no se puede asignar a un miembro con tipo System.DateTime que es un tipo de valor que no admite nulos.

¿Cómo escribo la consulta para permitir valores nulos en el campo LastNote? El campo DOB ​​se define como DateTime? y no tiene problemas manejando nulos.

Respuesta

23

Creo que lo descubrí.

Si lanzo el valor de nota máximo a un DateTime que puede agregarse nulos, parece eliminar la excepción. El siguiente cambio funcionó para mí:

LastNote = (Nullable<DateTime>)contact.Notes.Max(n => n.Created) 

Como otros han señalado, también se puede escribir usando la notación abreviada de un DateTime anulable de la siguiente manera:

LastNote = (DateTime?) contact.Notes.Max(n => n.Created) 
+2

estaba a punto de sugerir que – Jeremy

+0

Eso funcionará, aunque lo digo la taquigrafía de DateTime? es equivalente a Nullable (consulte la publicación de Keltex) –

9

de reescritura que la línea como:

LastNote = (DateTime?) contact.Notes.Max(n => n.Created), 
0

podría hacer eso, o podría alterar el esquema de su base de datos para que la columna 'Creado' no permita nulos.

El escenario está surgiendo porque una de las filas vuelve con un valor nulo para Creado. Si el db no permitió nulos, el escenario nunca ocurriría.

+0

Aún obtendría un nulo de regreso de la llamada a Max si el contacto nunca creara ninguna nota. –

+0

Esta sugerencia no es válida. Siempre existe la oportunidad de tener un DateTime nulo. He trabajado con varios db ahora que tienen un campo DT, como 'closing_date' ... no se ha aplicado ninguna fecha de cierre, por lo tanto, nulo. – IAbstract

3
LastNote = contact.Notes.Max(n => (DateTime?)n.Created) 

No se pudo encontrar esto en la red, así que espero que esto ayude a los demás.

1

En VB es algo así como:

LastNote = CType(contact.Notes.Max(n => n.Created), Global.System.Nullable(Of Date)) 

creo ...

Cuestiones relacionadas