Как сравнить только компоненты даты от DateTime в EF?

UPDATE some_table SET an_int_value = IF(an_int_value=1, 0, 1);

http://dev.mysql.com/doc/refman/5.1/en/control-flow-functions.html#function_if

115
задан abatishchev 20 May 2012 в 18:33
поделиться

4 ответа

ПРИМЕЧАНИЕ: на момент написания этого ответа EF-отношение было неясным (это было отредактировано в вопросе после того, как это было написано). Для правильного подхода с EF проверьте Mandeeps answer .


Вы можете использовать свойство DateTime.Date , чтобы выполнить сравнение только по дате.

DateTime a = GetFirstDate();
DateTime b = GetSecondDate();

if (a.Date.Equals(b.Date))
{
    // the dates are equal
}
121
ответ дан 24 November 2019 в 02:21
поделиться

Просто всегда сравнивайте свойство Date DateTime, а не полную дату и время.

При выполнении запроса LINQ используйте date.Date в запросе, например:

var results = from c in collection
              where c.Date == myDateTime.Date
              select c;
3
ответ дан 24 November 2019 в 02:21
поделиться

Чтобы сделать это в LINQ to Entities, вы должны использовать поддерживаемые методы :

var year = someDate.Year;
var month = ...
var q = from r in Context.Records
        where Microsoft.VisualBasic.DateAndTime.Year(r.SomeDate) == year 
              && // month and day

Уродливо, но это работает, и это делается на сервере БД.

8
ответ дан 24 November 2019 в 02:21
поделиться

Думаю, это может вам помочь.

Я сделал расширение, так как мне нужно сравнивать даты в репозиториях, заполненных данными EF, и поэтому .Date не подходил, поскольку он не реализован в Перевод LinqToEntities.

Вот код:

        /// <summary>
    /// Check if two dates are same
    /// </summary>
    /// <typeparam name="TElement">Type</typeparam>
    /// <param name="valueSelector">date field</param>
    /// <param name="value">date compared</param>
    /// <returns>bool</returns>
    public Expression<Func<TElement, bool>> IsSameDate<TElement>(Expression<Func<TElement, DateTime>> valueSelector, DateTime value)
    {
        ParameterExpression p = valueSelector.Parameters.Single();

        var antes = Expression.GreaterThanOrEqual(valueSelector.Body, Expression.Constant(value.Date, typeof(DateTime)));

        var despues = Expression.LessThan(valueSelector.Body, Expression.Constant(value.AddDays(1).Date, typeof(DateTime)));

        Expression body = Expression.And(antes, despues);

        return Expression.Lambda<Func<TElement, bool>>(body, p);
    }

, тогда вы можете использовать его таким образом.

 var today = DateTime.Now;
 var todayPosts = from t in turnos.Where(IsSameDate<Turno>(t => t.MyDate, today))
                                      select t);
24
ответ дан 24 November 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: