2015-01-27 5 views
0

내 검색어로 전달한 날짜와 가장 가까운 문서를 쿼리하려고합니다. 문제는 RavenDB 내 쿼리를 변환 할 수 없습니다입니다 :RavenDB : 범위가 가장 가까운 날짜를 찾으십시오.

경우 InvalidOperationException :

_session.Query<ExchangeRate>().OrderBy(d => Math.Abs((date - d.TimeStamp).Ticks)).First(); 

RavenDB이 번역하지 못할 경우 다음

내가 쿼리 시도하고있다 복근을 번역하는 방법을 이해 할 수 없습니다 수학 함수,이 다른 유형의 쿼리를 작성할 수있는 다른 옵션은 무엇입니까? Ayende의 답변에 따라 업데이트 1

내가 그 최적의 솔루션 확실하지, 작동하는 것 같다 다음을 시도했다. 또한 날짜가 사용 가능한 데이터 범위를 벗어나면 null을 반환하고 코드를 호출하여 처리 할 수 ​​있습니다.

 var rateBefore = _session.Query<ExchangeRate>() 
      .Where(x => x.TimeStamp.Date <= date.Date) 
      .OrderByDescending(x => x.TimeStamp) 
      .FirstOrDefault(); 

     var rateAfter = _session.Query<ExchangeRate>() 
      .Where(x => x.TimeStamp.Date >= date.Date) 
      .OrderBy(x => x.TimeStamp) 
      .FirstOrDefault(); 

     if (rateBefore == null || rateAfter == null) 
      return rateBefore ?? rateAfter; 

     var beforeDiff = Math.Abs(rateBefore.TimeStamp.Ticks - date.Ticks); 
     var afterDiff = Math.Abs(rateAfter.TimeStamp.Ticks - date.Ticks); 

     return beforeDiff <= afterDiff ? rateBefore : rateAfter; 

답변

0

이렇게하면 db의 모든 데이터를 검토해야합니다. 대신 두 개의 쿼리를 수행하십시오. 날짜와 같거나 더 작은 첫 번째 것을 얻는 사람. 날짜보다 크거나 같은 첫 번째 것을 얻는 사람.

그런 다음 가장 가까운 것을 선택하십시오.

+0

답변을 기반으로 솔루션을 사용하여 게시물을 업데이트했습니다. 이 문제점이나 개선 사항을 볼 수 있습니까? – JCoder23

+0

게으른 쿼리를 사용하면 한 단계 더 나아갈 수 있으므로 서버에 한 번만 요청할 수 있습니다. http://ravendb.net/docs/article-page/3.0/csharp/client-api/ session/querying/how-to-perform-queries-lazily –