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


138

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에서 지원되지 않습니다. 이니셜 라이저, 엔티티 멤버 및 엔티티 탐색 특성 만 지원됩니다."}

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


나는 EF 코어에서 2.1.1 x.DateTimeStart.Date를 사용할 수 있어요
키얼 스틴 탐욕

답변:


271

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와 함께 제공되는 클래스 를 사용해야합니다 .


1
버전을 약간 수정해야합니다 .Where (x => EntityFunctions.TruncateTime (x.DateTimeStart) == currentDate.Date); 당신의 thougs를 알려주세요
GibboK

1
난 당신이 내가 편집 당신이 그렇게 당신의 지원을위한 참조 :-) 감사에 대해 동의하는 경우 .date를 추가 답변을 생각하지 않았 으면, 정말 감사
GibboK

1
@GibboK 확실히, 문제 없습니다 :) 그것은 긴 문자열을 포맷하기위한 것입니다.
Sergey Berezovskiy

68
EntityFunctions가 사용되지 않습니다, 대신 DbFunctions.TruncateTime 방법 사용
shankbond

1
지정된 유형 멤버 'Date'는 LINQ to Entities에서 지원되지 않습니다. 이니셜 라이저, 엔터티 멤버 및 엔터티 탐색 속성 만 지원됩니다.
SAR

83

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

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


지정된 유형 멤버 'Date'는 LINQ to Entities에서 지원되지 않습니다. 이니셜 라이저, 엔터티 멤버 및 엔터티 탐색 속성 만 지원됩니다.
SAR

17

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

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

도움이 되길 바랍니다.


15

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

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

8

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

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

5

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

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 문과 유사한 문제를 설명 할 수 있습니다.


3

쉽게 한:

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


0

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

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.