2013-02-14 11 views
5
età

sto runing una query (in Northwind db) alla data di nascita e dipendenti Voglio ottenere la loro età. Come lo faccio?query LINQ sulla data di nascita per ottenere

private void Form1_Load(object sender, EventArgs e) 
    { 
     using (NorthWindDataContext dataContext = new NorthWindDataContext()) 
     { 
      DateTime today = DateTime.Today; 

      var q1 = from z in dataContext.Employees 
        select new 
        { 
         z.FirstName, 
         today-z.BirthDate <---- problem here 
        }; 

      dataGridView1.DataSource = q1; 

     } 
    } 

nella mia griglia finale voglio colonna di età.

data di nascita = 29/05/1969 (esempio)

+0

Qual è il problema? – V4Vendetta

risposta

9

Questo può essere difficile perché è necessario assicurarsi che il compleanno è passato quest'anno, altrimenti la vostra età sarà da uno.

var query = from e in dataContext.Employees 
      //get the difference in years since the birthdate 
      let years = DateTime.Now.Year - e.BirthDate.Year 
      //get the date of the birthday this year 
      let birthdayThisYear = e.BirthDate.AddYears(years) 
      select new 
      { 
       //if the birthday hasn't passed yet this year we need years - 1 
       Age = birthdayThisYear > DateTime.Now ? years - 1 : years 
      }; 

In questo modo ha il vantaggio di calcolare l'età nella query SQL generata. Ciò significa che non è necessario scorrere il set di risultati sul lato client per calcolare l'età.

Nel caso in cui siete interessati, si produrrà il seguente SQL:

-- Region Parameters 
DECLARE @p0 Int = 2013 
DECLARE @p1 DateTime = '2013-02-14 09:08:46.413' 
DECLARE @p2 Int = 1 
-- EndRegion 
SELECT [t2].[value] AS [years], [t2].[value2] AS [birthdayThisYear], 
    (CASE 
     WHEN [t2].[value2] > @p1 THEN [t2].[value] - @p2 
     ELSE [t2].[value] 
    END) AS [Age] 
FROM (
    SELECT [t1].[value], DATEADD(YEAR, [t1].[value], [t1].[BirthDate]) AS [value2] 
    FROM (
     SELECT [t0].[BirthDate], @p0 - DATEPART(Year, [t0].[BirthDate]) AS [value] 
     FROM [Employees] AS [t0] 
     ) AS [t1] 
    ) AS [t2] 
+0

Ottima risposta. Aggiungendo il mio codice, a questo lavoro, ho sostituito la riga "e.BirthDate.AddYears (years)" con DbFunctions.AddYears (e.BirthDate, anni) e tutto va bene –

0
var q1 = from z in dataContext.Employees 
      select new 
     { 
      z.FirstName, 
      z.BirthDate, 
      Age = DateTime.Now.Year - z.BirthDate.Year 
     }; 
+0

Non ero io, ma immagino che il downvote sia perché è un segno meno, non un trattino –

+0

@DoctorJones sì - dopo un'ulteriore ispezione mi sono reso conto che ha dichiarato la variabile oggi. Un po 'troppo presto :-) –

6

Crea oggetto anonimo che ha 3 proprietà: FirstName, Age e BirthDate (questa operazione è necessaria per il controllo, se dipendente di compleanno è passato quest'anno o no) .

var q1 = (from z in dataContext.Employees 
    select new 
    { 
     FirstName = z.FirstName, 
     Age = today.Year - z.BirthDate.Year, 
     BirthDate = z.BirthDate 
    }).ToList(); 

q1.ForEach(x => if (x.BirthDate > today.AddYears(-x.Age)) { x.Age--; }); 

Secondo i commenti (che sono a destra) si dovrebbe anche verificare se BirthDate è passato o no, così dopo aver selezionato i dati devi correre controllare per questo.

+0

Come cambierà prima e dopo il compleanno di una persona? – bendataclear

+1

Questo non funzionerà se il giorno di nascita non è ancora passato quest'anno. Riporterà un'età che è un anno troppo alta in quella situazione. –

+0

Questo ha lo svantaggio di dover calibrare l'età sul lato client a causa del foreach. Controlla la mia risposta per una soluzione che calcola l'età in SQL. –

1

Hai bisogno di un proprietà denominata, qualcosa di simile:

private void Form1_Load(object sender, EventArgs e) 
{ 
    using (NorthWindDataContext dataContext = new NorthWindDataContext()) 
    { 
     DateTime today = DateTime.Today; 

     var q1 = from z in dataContext.Employees 
       select new 
       { 
        Name = z.FirstName, 
        Age = today - z.BirthDate 
       }; 

     dataGridView1.DataSource = q1; 

    } 
} 
1
var temp = from o in dataContext.Employees 
    select new 
    { 
     FirstName = o.FirstName, 
     Age = DateTime.Now.Year - z.BirthDate.Year -1 
    }; 
Problemi correlati