[linq] 지정된 형식 멤버 ‘Date’는 LINQ to Entities에서 지원되지 않습니다. 이니셜 라이저, 엔터티 멤버 및 엔터티 탐색 속성 만

Entity Framework 에서이 코드를 사용 하면 다음 오류가 발생합니다. 특정 날짜의 모든 행을 DateTimeStart가져와야합니다.이 형식의 DataType 유형입니다.2013-01-30 12:00:00.000

암호:

 var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                    .Where(x =>  x.DateTimeStart.Date == currentDateTime.Date);

오류:

base {System.SystemException} = { “지정된 유형 멤버 ‘Date’는 LINQ to Entities에서 지원되지 않습니다. 이니셜 라이저, 엔티티 멤버 및 엔티티 탐색 특성 만 지원됩니다.”}

그것을 고치는 방법에 대한 아이디어가 있습니까?



답변

DateTime.DateSQL로 변환 할 수 없습니다. 날짜 부분을 가져 오려면 EntityFunctions.TruncateTime 메소드를 사용하십시오 .

var eventsCustom = eventCustomRepository
.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

업데이트 : 주석에서 언급 한 @ shankbond는 Entity Framework 6 EntityFunctions에서 사용되지 않으므로 Entity Framework DbFunctions와 함께 제공되는 클래스 를 사용해야합니다 .


답변

이제 사용해야합니다 DbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();


답변

엔티티 프레임 워크 에서이 문제를 해결하는 데 도움이되는 솔루션을 추가하고 싶습니다.

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                .Where(x =>  x.DateTimeStart.Year == currentDateTime.Year &&
                             x.DateTimeStart.Month== currentDateTime.Month &&
                             x.DateTimeStart.Day == currentDateTime.Day
    );

도움이 되길 바랍니다.


답변

EntityFunctions더 이상 사용되지 않습니다. DbFunctions대신 사용하십시오 .

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
   .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);


답변

x.DateTimeStart와 currentDate 모두에 대해 항상 EntityFunctions.TruncateTime ()을 사용하십시오. 같은 :

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));


답변

간단한 속성 만 사용하십시오.

var tomorrow = currentDateTime.Date + 1;
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                            .Where(x =>  x.DateTimeStart >= currentDateTime.Date
                                   and x.DateTimeStart < tomorrow);

앱에서 미래 날짜를 사용할 수 없으면 > = x.DateTimeStart> = currentDateTime.Date 이면 충분합니다.

더 복잡한 날짜 비교
가있는 경우 정식 함수 를 확인 하고 EF6 + DB 함수 가 있는지 확인하십시오.

보다 일반적으로-문제를 검색하는 사람들을 위해 EF에서 지원되는 Linq 메소드는
메모리 기반 목록에서는 작동하지만 EF에서는 작동하지 않는 linq 문과 유사한 문제를 설명 할 수 있습니다.


답변

쉽게 한:

DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();