IT박스

지정된 유형 멤버 'Date'는 LINQ to Entities에서 지원되지 않습니다.

itboxs 2020. 7. 9. 19:31
반응형

지정된 유형 멤버 '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} = {"The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."}

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


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

EF6 사용시 다음 코드를 사용하십시오.

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)

다른 해결책은 다음과 같습니다.

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

참고 : https://stackoverflow.com/questions/14601676/the-specified-type-member-date-is-not-supported-in-linq-to-entities-only-init

반응형