2011-01-14 7 views
8

En la declaración LINQ siguiente, deseo seleccionar personas con una fecha de examen en 2010. La fecha del examen se almacena como fecha y hora, como la fecha y hora reales otras aplicaciones. ¿Cuál es la forma más elegante, más fácil y mejor para comparar la fecha de exzam con solo '2010'? O, ¿debería simplemente comparar, usando> =, la fecha del examen al 1/1/2010?Usar solo el año como parte de una fecha para una condición DONDE

var active = dc.People.Where(x => x.exam >= 2010) 
     .Select(x => new {x.ContactID, x.FirstName, x.LastName}) 
        ); 

x.MostRecent == DateTime.Parse("1/1/2010").Year 

editar # 1

pensé que debería ver a un .Año en la fecha de examen, pero no lo hice. Después de ver un par de puestos aquí volví y encontré esto funciona ...

.Where(x => x.exam.Value.Year == 2010) 

¿Por qué es necesario acceder a .Value .Año? El examen es una fecha de tiempo anulable.

+0

'.Value' es necesario porque' exam' es un campo anulable en su modelo. (Supongo que en su base de datos la columna correspondiente permite valores NULL). –

+0

@Scott: eso es correcto, el DB permite nulos en esa columna. Gracias. – DenaliHardtail

Respuesta

18

Usted sólo puede usar la propiedad Year en DateTime:

var active = from p in dc.People 
      where p.Exam.Year >= 2010 
      select new { 
       p.ContactID, 
       p.FirstName, 
       p.LastName 
      }; 

¿por qué es necesario acceder a .Value .Año? El examen es una fecha de tiempo anulable.

Exactamente porque Exam es un Nullable<DateTime>. Cuando se declara una instancia de Nullable<DateTime> como

DateTime? exam; 

nota que exam no es un DateTime y por lo tanto no se puede acceder directamente a las propiedades de DateTime. Para obtener un ejemplo concreto de DateTime se utiliza la propiedad de ValueNullable<DateTime> (todos Nullable<T> s tienen esta propiedad) para que

DateTime instance = exam.Value; 

es una DateTime suponiendo que exam no es null. Por lo tanto, se puede decir

int year = instance.Year; 

y, por supuesto, por razones de brevedad

int year = exam.Value.Year; 

Tenga en cuenta que esto va a tirar si exam.HasValue es falso.

+0

Ver mi edición superior. ¿Por qué tengo que usar .Value.Year? – DenaliHardtail

+0

@ SpecialAgent_W436: Exactamente porque 'People.Exam' es un' Nullable '(también conocido como' DateTime? '). – jason

+0

¡Gracias por la explicación! Perfectamente claro ahora. – DenaliHardtail

0

no sé la forma más elegante, pero esta es la forma más sencilla que puede hacerlo asumiendo examdate es la columna de fecha y hora que se almacenan la fecha y en base a I want to select people with an exam date in 2010 -

var active = dc.People.Where(x => x.examdate.year == 2010) 
     .Select(x => new {x.ContactID, x.FirstName, x.LastName}) 
        ); 
Cuestiones relacionadas