2016-05-14 18 views
0

ブール値フラグに基づいて、時間間隔でドキュメントの検索を行う関数があり、NESTクエリは異なる場合がありますLessThanOrEqual if文と他のステートメントのより少ない私はブールフラグを使用して、このNESTクエリを動的にすることができますどのように「includeEnd」私はif文を使用する必要がないようにNESTの動的弾性検索クエリの作成方法C#

public IEnumerable<Book> GetBooks(DateTime startTime, DateTime endTime, string author, bool includeEnd) 
{ 
    var readRecords; 
    if (includeEnd){ 
     readRecords = elastic.Search<Book>(s => s.Index(IndexName) 
     .Query(q => q.Term(book => book.Author, author) && 
      q.DateRange(i => i.Field(book => book.Author)  
      .GreaterThanOrEquals(startTime) 
      .LessThanOrEquals(endTime)))).Documents.ToArray();  
    } 
    else{ 
    readRecords = elastic.Search<Book>(s => s.Index(IndexName) 
      .Query(q => q.Term(book => book.Author, author) && 
      q.DateRange(i => i.Field(book => book.Author) 
      .GreaterThanOrEquals(startTime) 
      .LessThan(endTime)))).Documents.ToArray(); 
    } 
    return readRecords; 
} 

+0

ifステートメントでは、日付範囲クエリにNESTクエリで "LessThanOrEqual"を使用して終了時間を指定し、elseステートメントではNESTクエリでLessThanのみを使用して終了時間を除外します。 –

答えて

1

LessThanOrEqualsとLessThanの汎用拡張メソッドが何をするかを見てみましょう。基本的には、TのDateRangeQueryDescriptor(この場合はTはBook)を拡張し、DateMath引数を受け入れ、別のDateRangeQueryDescriptorを返します。したがって、includeEndフラグに応じて、クエリディスクリプタを期待する正しい関数を返す関数を除外できます。

public IEnumerable<Book> GetBooksUsingExtension(DateTime startTime, DateTime endTime, string author, bool includeEnd) 
    { 
     return elastic.Search<Book>(s => s 
      .Index(IndexName) 
      .Query(q => q.Term(book => book.Author, author) && 
         q.DateRange(i => i.Field(book => book.Author) 
          .GreaterThanOrEquals(startTime) 
          .LessThanWithOption(endTime, includeEnd) 
         ))) 
       .Documents 
       .ToArray(); 

    } 

巣のほとんどは流れるようなインターフェイスの拡張:

public static class DateQueryExtensions 
{ 
    public static DateRangeQueryDescriptor<T> LessThanWithOption<T>(this DateRangeQueryDescriptor<T> q, DateMath to, bool includeEnd) 
     where T : class 
    { 
     return includeEnd ? q.LessThanOrEquals(to) : q.LessThan(to); 
    } 
} 

は、その後、あなたがこのようにそれを使用することができます:

public IEnumerable<Book> GetBooks(DateTime startTime, DateTime endTime, string author, bool includeEnd) 
    { 
     var dateFilter = includeEnd ? 
      // you have to do a little casting for the lambdas to know what type we're returning 
      (Func<DateRangeQueryDescriptor<Book>, DateRangeQueryDescriptor<Book>>) 
      (q => q.LessThanOrEquals(endTime)) 
      : q => q.LessThan(endTime); 

     return elastic.Search<Book>(s => s 
      .Index(IndexName) 
      .Query(q => q.Term(book => book.Author, author) && 
         q.DateRange(i => 
         { 
          i = i.Field(book => book.Author) 
          .GreaterThanOrEquals(startTime); 
          return dateFilter(i); 
         } 
       ))) 
       .Documents 
       .ToArray(); 
    } 

は、あなた自身の拡張メソッドを書くことができ、さらにこの考え方を取るために、同様の方法でクエリ記述子を操作します。

+0

ありがとう貴重な解決策 –

関連する問題