2012-04-10 9 views
1

私はRavenDb(ウェブサイトのクラッドではない)で多くのバックエンドデータ操作を行っています。私は本質的に同じスキップ/テイクのクエリを実行するために数多くのメソッドを散らばっていますが、パラメータは異なります。私が欲しいものの多くは単純にです:このクエリに一致するdb内のforeachドキュメントは、このアクションを行います。RavenDB ForEach ExtensionMethod抽象化

少しヘルパーを作成しましたが、セレクターを適用する方法を理解できていないようです。例えば、私の最終目標は、書くことのようになります。ここでは

MyDocStore.ForEach<Users>( 
    x => x.Where(u => u.LastName == "Smith").OrderBy(u => u.FirstName), 
    x => Console.WriteLine("{0}", x.FirstName), 
    take: 12); 

は、私がこれまで持っているものです。

public static class RavenHelper 
{ 
    public static void ForEach<TSource>(
     this IDocumentStore documentStore, 
      Func<TSource, IEnumerable<TSource>> selector, 
      Action<TSource> action, 
      int take = 128) 
    { 
     var skip = 0; 
     while(true) 
     { 
      using(var session = documentStore.OpenSession()) 
      { 
       var list = session.Query<TSource>(); 
       // How do I apply more selectors? 
       var result = list.Take(take).Skip(skip).ToList(); 

       if(!result.Any()) 
       { 
        return; 
       } 

       foreach(var il in result) 
       { 
        action(il); 
       } 

       skip += take; 
      } 
     } 
    } 
} 
+0

あなたの 'selector'パラメータは、さまざまなエクステンションコールがチェーン接続されたものです彼女?または、どこでソートするだけですか? –

+0

私は、典型的なlinq呼び出しで意味をなさない何かになりたいです。たとえば、.Customize()コールはRavenDbによく使用されます。 –

答えて

2

あなたが必要:

 Expression<Func<TSource, bool>> selector, 

そして呼び出す:

 .Where(selector) 
+0

ありがとう、しかし、私はこれが単一の式を扱うと思う。私は鎖がどのように起こるかを見ていません(どこかとorderbyの両方をしています(元の質問を参照))。 –