2012-04-10 69 views
1

我在RavenDb(不是網站crud)中做了大量的後端數據操作。我有幾十種方法分散執行基本上相同的跳過/查詢,但具有不同的參數。我想要的大部分內容就是:db中與查詢匹配的foreach文檔,請執行此操作。RavenDB ForEach Extension方法抽象

我創建了一個小幫手,但似乎無法弄清楚如何將選擇器應用到它。例如,我的最終目標可能是這樣寫:

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'參數可能會被鏈接的各種擴展調用她嗎?或者你會在哪裏和排序? – 2012-04-10 23:46:53

+0

我很想成爲典型的linq調用中有意義的任何東西。例如,.Customize()調用經常用於RavenDb。 – 2012-04-11 03:20:41

回答

2

您需要:

 Expression<Func<TSource, bool>> selector, 

然後調用:

 .Where(selector) 
+0

謝謝,但我認爲這隻能處理單個表達式。我看不出連鎖是如何發生的(做一個where和orderby(參見原始問題))。 – 2012-04-11 15:05:50