2013-02-14 9 views
5

私は従業員の生年月日のクエリを(northwind dbで)実行しています。年齢を取得したいと思います。それ、どうやったら出来るの?生年月日を取得するLINQクエリ

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; 

     } 
    } 

私の最後のグリッドには、年齢の列が必要です。

生年月日= 29/05/1969(例)

+0

を? – V4Vendetta

答えて

9

これは注意が必要です。

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 
      }; 

このようにすると、生成されたSQLクエリで年齢を計算する利点があります。つまり、年齢を計算するためにクライアント側で結果セットを反復処理する必要はありません。あなたが興味を持っている場合は

、それは次のような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

偉大な答え。私のコードをこの作業に追加するだけで、 "e.BirthDate.AddYears(years)"という行をDbFunctions.AddYears(e.BirthDate、years)という行に置き換え、すべてうまくいく –

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

それは私ではありませんでしたが、ハイフンではなくマイナスであることを推測しています –

+0

@DoctorJonesはい - さらなる検査の結果、今日は変数が宣言されています。早すぎるビット:-) –

6

3つのプロパティを持つ匿名オブジェクトを作成します。FirstNameAgeBirthDateを(従業員の誕生日が今年合格したりしていない場合、これは、チェックのために必要とされます) 。

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--; }); 

BirthDateが経過したりしていない場合(右です)のコメントによると、あなたもチェックする必要があり、そのデータを選択した後、あなたはそれをチェックし実行する必要があります。

+0

人の誕生日の前後にどのように変更されますか? – bendataclear

+1

誕生日が今年も過ぎていない場合、これは機能しません。そのような状況では年齢が高すぎると報告されます。 –

+0

これは、foreachのためにクライアント側で年齢を計算する必要があるという欠点を持っています。 SQLの年齢を計算するソリューションのための私の答えをチェックしてください。 –

1

あなたはという名前のプロパティを必要とし、このような何か:あなたがそうでなければ、あなたの年齢は1によってなり、誕生日は今年合格したことを確認する必要があるため

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 
    }; 
関連する問題