Самый короткий способ проверить возрастной фильтр в LINQ? - PullRequest
1 голос
/ 17 января 2011

Я пытаюсь проверить людей в определенном диапазоне - пусть lb-lowerbound и ub-верхняя граница соответствуют, например, возрастная группа с lb = 18 и ub = 24, что означает, что я пытаюсь отфильтровать людей в возрасте от 18 до 24 лет. Также поле Datetime в базе данных для даты рождения обнуляется. У меня есть этот код -

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;

но это только проверка по году, как мне использовать месяц, узнать фактический возраст и отфильтровать пользователей по возрасту? Спасибо всем за помощь.

Ответы [ 3 ]

10 голосов
/ 17 января 2011

Во-первых, этот запрос неверен с точки зрения времени в течение года - вам может быть 17 лет, и все равно считается, например, 18 - очень немногие люди, родившиеся в 1993 году, на сегодняшний день 18 (17 января 2011 года).Кроме того, он вычисляет DateTime.Now несколько раз, что означает, что год может варьироваться , пока выполняется запрос .

Наконец, если у вас есть только одно предложение where и вашselect предложение не допускается, как правило, проще использовать синтаксис метода расширения, а не выражение запроса.

Я бы предложил:

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

РЕДАКТИРОВАТЬ: для большей ясности,для максимального возраста (скажем) 10 лет это означает, что вы хотите исключить любого, чья дата рождения была 11 лет назад или более, поэтому вы должны написать:

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);
2 голосов
/ 17 января 2011

Это должно сработать (не проверено):

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;
0 голосов
/ 14 марта 2019

Почему бы просто не создать модель возраста и сравнить возраст, а не возиться с датами?

public class Age
{
    private readonly DateTime dob;

    public Age(DateTime dob)
    {
        this.dob = dob;           
    }

    public int Value
    {
        get { return this.CalculateAge(this.dob); }
    }

    private int CalculateAge(DateTime dob)
    {
        DateTime today = DateTime.Today;
        int age = today.Year - dob.Year;
        if (today.Month < dob.Month || (today.Month == dob.Month && today.Day < dob.Day))
            age--;
        return age;
    }
}

Затем используйте linq для запроса минимального и максимального возрастов.Вы бы указали возраст как свойство в модели вашего сотрудника.Когда вы строите своего сотрудника, вам нужно будет использовать возрастной класс для расчета возраста.Ваш linq будет выглядеть так:

var years = employee.Where(e.Age >= min && e.Age <= max);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...