[c#] EF에서 DateTime의 날짜 구성 요소 만 비교하는 방법은 무엇입니까?

두 개의 날짜 값이 있는데 하나는 이미 데이터베이스에 저장되어 있고 다른 하나는 DatePicker를 사용하여 사용자가 선택했습니다. 유스 케이스는 데이터베이스에서 특정 날짜를 검색하는 것입니다.

이전에 데이터베이스에 입력 한 값은 항상 12:00:00의 시간 구성 요소를 가지며 선택기에서 입력 한 날짜는 다른 시간 구성 요소를 갖습니다.

날짜 구성 요소에만 관심이 있고 시간 구성 요소를 무시하고 싶습니다.

C #에서이 비교를 수행하는 방법은 무엇입니까?

또한 LINQ에서이 작업을 수행하는 방법은 무엇입니까?

업데이트 : LINQ to Entities에서 다음이 제대로 작동합니다.

e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0



답변

참고 : 이 답변을 작성할 당시에는 EF- 관계가 명확하지 않았습니다 (작성된 후 질문으로 편집 됨). EF에 대한 올바른 접근 방식은 Mandeeps answer를 확인하십시오 .


DateTime.Date속성을 사용하여 날짜 만 비교를 수행 할 수 있습니다 .

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

if (a.Date.Equals(b.Date))
{
    // the dates are equal
}


답변

EntityFunctions시간 부분을 다듬기 위해 수업 을 사용하십시오 .

using System.Data.Objects;

var bla = (from log in context.Contacts
           where EntityFunctions.TruncateTime(log.ModifiedDate) ==  EntityFunctions.TruncateTime(today.Date)
           select log).FirstOrDefault();

출처 : http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/

최신 정보

EF 6.0 이상 EntityFunctions 현재로 대체 DbFunctions .


답변

이것이 당신을 도울 수 있다고 생각합니다.

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


답변

DateDB 엔터티에 속성을 사용하면 예외가 발생합니다.

"The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."

다음과 같이 사용할 수 있습니다.

  DateTime date = DateTime.Now.Date;

  var result = from client in context.clients
               where client.BirthDate >= date
                     && client.BirthDate < date.AddDays(1)
               select client;


답변

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

추악하지만 작동하며 DB 서버에서 수행됩니다.


답변

여기에 다른 방법이 있지만 SecondDate가 전달하는 변수 인 경우에만 유용합니다.

DateTime startDate = SecondDate.Date;
DateTime endDate = startDate.AddDays(1).AddTicks(-1);
...
e => e.FirstDate.Value >= startDate && e.FirstDate.Value <= endDate

작동해야한다고 생각합니다


답변

이것을 사용할 수도 있습니다.

DbFunctions.DiffDays(date1, date2) == 0