Использование только годовой части даты для условия WHERE - PullRequest
11 голосов
/ 14 января 2011

В приведенном ниже утверждении LINQ я хочу выбрать людей с датой экзамена в 2010 году. Дата экзамена сохраняется как дата и время, поскольку фактические дата и время используются в других приложениях.Какой самый элегантный, простой и лучший способ сравнить дату exzam только с «2010».Или я должен просто сравнить, используя> =, дату экзамена с 01.01.2010?

var active = dc.People.Where(x => x.exam >= 2010)
        .Select(x => new {x.ContactID, x.FirstName, x.LastName})
                   );

x.MostRecent == DateTime.Parse("1/1/2010").Year

РЕДАКТИРОВАТЬ # 1

Я думал, что должен увидеть год на экзаменедата, но я не сделал.После просмотра нескольких сообщений здесь я вернулся и обнаружил, что это работает ...

.Where(x => x.exam.Value.Year == 2010)

Почему. Значение необходимо для доступа. Год?Экзамен обнуляемая дата и время.

Ответы [ 2 ]

21 голосов
/ 14 января 2011

Вы можете просто использовать свойство Year в DateTime:

var active = from p in dc.People
             where p.Exam.Year >= 2010
             select new {
                 p.ContactID,
                 p.FirstName,
                 p.LastName
             };

Почему. Значение необходимо для доступа .Year?Экзамен обнуляемая дата и время.

Именно потому, что Exam - это Nullable<DateTime>.Когда вы объявляете экземпляр Nullable<DateTime>, например

DateTime? exam;

, обратите внимание, что exam не является DateTime, и поэтому вы не можете напрямую получить доступ к свойствам DateTime.Чтобы получить конкретный экземпляр DateTime, вы используете свойство Value для Nullable<DateTime> (все Nullable<T> s имеют это свойство), так что

DateTime instance = exam.Value;

- это DateTime при условии, что exam не null.Следовательно, вы можете сказать

int year = instance.Year;

и, конечно, для краткости

int year = exam.Value.Year;

Обратите внимание, что это будет выбрасываться, если exam.HasValue ложно.

0 голосов
/ 14 января 2011

Я не знаю, какой самый элегантный способ, но это самый простой способ, которым вы можете сделать это, предполагая, что examdate - это поле даты и времени, в которое вы сохраняете дату и основанное на I want to select people with an exam date in 2010 -

var active = dc.People.Where(x => x.examdate.year == 2010)
        .Select(x => new {x.ContactID, x.FirstName, x.LastName})
                   );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...