2011-01-14 9 views
8

In der LINQ-Anweisung unten möchte ich Personen mit einem Prüfungsdatum im Jahr 2010 auswählen. Das Prüfungsdatum wird als Datum und Uhrzeit gespeichert andere Anwendungen. Was ist der eleganteste, einfachste und beste Weg, das exzam-Datum mit "2010" zu vergleichen? Oder soll ich einfach mit> = dem Prüfungstermin zum 1.1.2010 vergleichen?Verwendung nur des Jahrteils eines Datums für eine WHERE-Bedingung

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 

EDIT # 1

Ich dachte, ich .year auf dem Prüfungstermin sehen sollte, aber ich tat es nicht. Nachdem ich hier ein paar Beiträge ging ich zurück und fand das funktioniert ...

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

Warum ist .Wert notwendig .year zugreifen? Die Prüfung ist eine nullbare Datetime.

+0

'.Value 'ist erforderlich, da' examination 'in Ihrem Modell ein Nullwertfeld ist. (Ich nehme an, dass in Ihrer Datenbank die entsprechende Spalte NULL erlaubt.) –

+0

@Scott - Das stimmt, die DB erlaubt Nullen in dieser Spalte. Vielen Dank. – DenaliHardtail

Antwort

18

können Sie nur verwenden, die Year Eigenschaft auf DateTime:

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

Warum ist .Wert notwendig .year zugreifen? Die Prüfung ist eine nullbare Datetime.

Genau, weil Exam ein Nullable<DateTime> ist. Wenn Sie deklarieren eine Instanz von Nullable<DateTime> wie

DateTime? exam; 

beachten Sie, dass exam kein DateTime ist und daher können Sie nicht direkt die Eigenschaften von DateTime zugreifen. Um ein konkretes Beispiel von DateTime zu bekommen verwenden Sie die Value Eigenschaft auf Nullable<DateTime> (alle Nullable<T> s diese Eigenschaft haben), so dass

DateTime instance = exam.Value; 

ist ein DateTime davon aus, dass exam nicht null. Sie können daher

int year = instance.Year; 

sagen und, natürlich, der Kürze halber

int year = exam.Value.Year; 

Beachten Sie, dass dies werfen, wenn exam.HasValue falsch ist.

+0

Siehe meine Bearbeitung oben. Warum musste ich .Value.Year verwenden? – DenaliHardtail

+0

@ SpecialAgent_W436: Genau weil 'People.Exam' eine' Nullable '(aka,' DateTime? ') Ist. – jason

+0

Danke für die Erklärung! Perfekt jetzt klar. – DenaliHardtail

0

Ich weiß nicht die eleganteste Art, aber dies ist die einfachste Art und Weise Sie es unter der Annahme, examdate tun können, ist die Datetime-Spalte, die Sie Ihren Termin zu speichern und basierend auf 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}) 
        );