2012-04-10 3 views
1

Я делаю много данных для обработки данных в RavenDb (не сайт crud). У меня есть десятки методов, разбросанных вокруг, для того, чтобы делать по существу те же самые пропуски/запросы, но с разными параметрами. Большая часть того, что я хочу, просто: foreach document в db, который соответствует этому запросу, выполните это действие.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

Спасибо, но я думаю, что это обрабатывает только одно выражение. Я не вижу, как может произойти цепочка (делать как «где», так и «порядок» (см. Исходный вопрос)). –

Смежные вопросы