7

従業員の生年月日に (ノースウィンド データベースで) クエリを実行していますが、年齢を取得したいと考えています。それ、どうやったら出来るの?

    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;

        }
    }

私の最終的なグリッドでは、年齢の列が必要です。

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

4

5 に答える 5

15

今年の誕生日が過ぎていることを確認する必要があるため、これは難しい場合があります。そうしないと、年齢が 1 つずれてしまいます。

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]
于 2013-02-14T09:12:34.427 に答える
6

FirstNameAgeおよびの3 つのプロパティを持つ匿名オブジェクトを作成しますBirthDate(これは、従業員の誕生日が今年過ぎたかどうかを確認するために必要です)。

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渡されたかどうかも確認する必要があるため、データを選択した後、その確認を実行する必要があります。

于 2013-02-14T09:01:43.270 に答える
1
var temp = from o in dataContext.Employees
    select new
    {
         FirstName = o.FirstName,
         Age = DateTime.Now.Year - z.BirthDate.Year -1
    };
于 2013-02-14T09:09:18.697 に答える
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;

    }
}
于 2013-02-14T09:03:00.473 に答える