2016-12-08 2 views
5

데이터베이스를 쿼리하고 특정 날짜의 삭제 된 제품을 검색하려면 다음 LINQ가 있어야합니다. FROMDATE이 2016년 12월 8일 11시 41분 FROMDATE = {때LINQ의 DateTime 비교가 올바른 결과를 반환하지 않음

return _myDbEntities.Log 
      .Where(p => p.Action.Equals("Deleted") && 
      (p.ActionDate > fromDate)) 
      .Select(p => new DeletedProduct() 
      { 
       ProductId = p.ProductId, 
       ActionDate = p.ActionDate 
      }).ToList(); 

그러나 쿼리는 = {2016년 12월 8일 오전 11시 41분 0초} product.ActionDate.Value 같은 값을 불러 오는됩니다 : 00 AM}

쿼리에 분명히 GREATER THAN이 표시됩니다. 여기서 무슨 일이 일어나고있는거야?

+0

초 단위를 확인하십시오 (또는 타임 스탬프로 표시). 아마 차이가 있습니다 –

+2

ActionDate는 어떤 유형입니까? 시도해 보실래요? (P.ActionDate.Value> fromDate)? –

+0

쿼리에서 'product.ActionDate'를 사용하고 있는데 가슴에는'product.ActionDate.Value'가 필요합니다. – Guy

답변

0

DateTime 유형은 초보다 훨씬 높은 정밀도로 시간을 저장합니다. 밀리 초 또는 틱 (100 나노 세컨드) 수준에서 다를 수 있습니다. 더 높은 수준에서 비교하려는 경우

,이 시도 : 10000000 두 번째에있는 진드기의 수는

(p.ActionDate.Ticks/10000000) > (fromDate.Ticks/10000000) 

. /은 분수를 자르는 정수 부분이므로 틱을 초 단위로 전환합니다.

UPDATE : 당신이 엔티티 프레임 워크를 사용하는 것처럼

것 같다. 위의 비교는 아마도 거기에서 작동하지 않을 것입니다. 해결 방법은 데이터베이스에 대해 원래 쿼리를 실행하고 ToList을 수행 한 다음 위의 논리를 사용하여 LINQ2Objects 쿼리에서 결과를 다시 필터링하십시오.

+0

** 메모리에 추가 필터링을 수행하기 위해 모든 목록을 가져 오지 않으려 고합니다 **. 프로젝트의 크기에 따라 데이터베이스에서 반환되는 많은 여분의 데이터를 생성 할 수 있습니다.이 데이터는 C# 개체로 파싱되어야합니다. 보유하고있는 도구 (SQL Server)를 활용하여 필터링을 수행하십시오. – krillgar

+0

@krillgar : 모든 목록을 가져 오지 않습니다. 이미 비교를 수행하는 원래 쿼리 결과를 가져옵니다. 두 번째 필터는 두 번째 레벨에서만 값이 다른 몇 가지 결과를 필터링하는 것입니다. – Sefe

+0

좋아, 나는 오해했다. OP가 데이터베이스를'datetime2' 컬럼으로 변경하는 능력이 없다면, 이것은 작동 할 것입니다. 그러나 그들이 그 변화를 만들 수 있다면, 당신은 이것을 할 필요가 없을 것입니다. – krillgar

관련 문제