2017-04-18 7 views
0

나는 EndDate라는 DateTime? 열이있는 테이블이있는 sql-server-ce 4 데이터베이스가 있습니다. 레코드를 삭제할 때이 종료 날짜를 설정하고 레코드 목록을 검색 할 때 끝 날짜에 필터를 적용하여 삭제 된 레코드를 모두 필터링하려고합니다.linq의 DateTime과 SQL Server CE를 비교하는 가장 쉬운 방법은 무엇입니까?

필자는 엔티티 프레임 워크를 사용하여 linq를 통해이 필터를 적용합니다. 나는 다음과 같은 오류 받기 LINQ 쿼리를 실행하면

protected IDbSet<TEntity> Entities; 
... 
Entities.AsNoTracking().AsQueryable() 
    .Where(entity => !entity.EndDate.HasValue || entity.EndDate.Value > DateTime.UtcNow); 

이 :이 오류에 검색

The function 'CurrentUtcDateTime' is not supported by SQL Server Compact.

를 내가 이해 한 경우 나 그 (알

내 LINQ 쿼리는 다음과 같습니다 정확하게) 나는 DateTime.UtcNow를 사용할 수 없다.

내 질문은 도달하려는 목표를 달성하기위한 다른 방법은 무엇입니까?

linq을 통해 사용할 수있는 다른 기능이 있습니까? 아니면 datetime을 Epoch로 변환하고 비교하는보다 원시적 인 솔루션을 사용해야합니까?

+1

'var now = DateTime.UtcNow;'그리고 나서'... entity.EndDate.Value>를 시도해 보셨습니까? – Igor

+0

entity.EndDate.Value.ComparetTo (otherDate) 조회 CompareTo – kblau

+0

과속자 님, 고맙습니다. 나는 그것을 시도했다고 생각했지만, 나는 그렇지 않은 것으로 생각한다. 나는 아직도 var이 받아 들여지고 속성이 왜 아닌지 궁금해합니다. 어떤 아이디어? – Cornelis

답변

0

문제는 아직 실행 프로세스가 사용할 수있는 구체적인 데이터로 이루어지지 않았 음을 의미 IQueryable 상태이기 때문에, 코드 샘플 동작 조작 로컬 없다는 것이다. 이를 통해 다른 Where 절과 같은 다른 연산에 의해 쿼리를 조정할 수 있습니다.

실제로 데이터를 쿼리하면 Linq는 SQL을 생성하여 해당 작업을 수행하고 데이터베이스로 전송되며 SQL은 UTC.Now을 확인할 수 없습니다. ToList가 런타임에 availble을 데이터를 만들기를 통해 작동합니다

Entities.AsNoTracking().ToList() 
         .Where(entity => !entity.EndDate.HasValue 
              || entity.EndDate.Value > DateTime.UtcNow); 

:

하나의 클라이언트 옵션을 낮추기 다음과 같은를 필터링하여, 데이터 콘크리트를 만드는 것입니다. 비용은 물론 클라이언트에서 필터링하기 위해 모든 값을 가져 오는 것입니다. 그 수가 적 으면 수천 개의 레코드라면 할 수 있습니다. 권고하지 않았다.


그렇지 않으면 데이터베이스 옵션은 필요한 기록을 가지고, 또는 필요한 시험 (들)에 대한 부울을 반환하는 계산 된 열 필드를 추가 할 저장 프로 시저를 만들 수 있습니다.