LINQ查询出生日期以获得年龄

dar*_*rko 6 c# linq-to-sql

我正在对员工的出生日期进行查询(在northwind db中),我希望得到他们的年龄.我怎么做?

    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;

        }
    }
Run Code Online (Sandbox Code Playgroud)

在我的最终网格中,我想要年龄列.

birthdate = 29/05/1969(示例)

Rei*_*ica 12

这可能很棘手,因为你需要确保今年过生日,否则你的年龄将会超过一岁.

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
            };
Run Code Online (Sandbox Code Playgroud)

这样做具有在生成的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]
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案。只需添加我的代码,在这项工作中,我用 DbFunctions.AddYears(e.BirthDate, years) 替换了“e.BirthDate.AddYears(years)”行,一切顺利 (2认同)

gza*_*axx 6

创建一个有3个属性匿名对象:FirstName,AgeBirthDate(这是需要检查,如果员工生日今年已通过).

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--; });
Run Code Online (Sandbox Code Playgroud)

根据评论(这是正确的)你还应该检查是否BirthDate已经通过,所以在选择数据后你必须运行检查.