O caminho mais curto para verificar o filtro de idade no LINQ?

Estou tentando verificar as pessoas em um determinado intervalo – vamos lb-inferior e ub-limite superior correspondente por exemplo, faixa etária com lb = 18 e ub = 24 ou seja, eu estou tentando filtrar as pessoas com idade entre 18 e 24. Também O campo de data e hora no database para data de nascimento é anulável. Eu tenho esse código –

var users=from e in employee where e.DOB.HasValue && ((DateTime.Now.Year - e.DOB.Value.Year)) >= lb) && ((DateTime.Now.Year - e.DOB.Value.Year) <= ub) select e; 

mas isso é apenas verifica com o ano como faço para usar o mês e descobrir a idade real e filtrar os usuários de acordo com sua idade? Obrigado a todos pela sua ajuda.

Em primeiro lugar, essa consulta é incorreta em termos de horários durante o ano – você poderia ter 17 anos e ainda ser 18, por exemplo – muito poucas pessoas nascidas em 1993 são 18 a partir de hoje (17 de janeiro de 2011). Além disso, está computando o DateTime.Now várias vezes, o que significa que o ano pode variar enquanto a consulta está sendo executada .

Finalmente, se você acabou de ter uma cláusula where e sua cláusula select é um não-op, geralmente é mais simples usar a syntax do método de extensão em vez de uma expressão de consulta.

Eu sugeriria:

 DateTime today = DateTime.Today; DateTime min = today.AddYears(-ub); DateTime max = today.AddYears(-lb); var years = employee.Where(e => e.DOB != null && e.DOB >= min && e.DOB <= max); 

EDIT: Para ser mais claro, para uma idade máxima de (digamos) 10, isso significa que você deseja excluir alguém cuja data de nascimento foi de 11 anos atrás ou mais, então você escreveria:

 DateTime today = DateTime.Today; DateTime min = today.AddYears(-(maxAge + 1)); DateTime max = today.AddYears(-minAge); var years = employee.Where(e => e.DOB != null && e.DOB > min && e.DOB <= max); 

Isso deve fazer o truque (não testado):

 var users = from e in employee where e.DOB.HasValue && (DateTime.Today - e.DOB.Value.Date) >= min.Date && e.DOB.Date <= max.Date select e;