2012-02-26 2 views
3

Je regardais le code source pour RacoonBlog en essayant de trouver un moyen dans RavenDB d'interroger une collection contenue dans un document. J'ai lu sur les index et Map/Reduce et n'a pas réussi à trouver ma réponse.Comment fonctionne cette requête linq RavenDB

Dans le PostsController, il existe un ActionResult appelé Tag qui prend un paramètre de chaîne et contient la requête linq suivante.

var posts = RavenSession.Query<Post>() 
    .Include(x => x.AuthorId) 
    .Statistics(out stats) 
    .WhereIsPublicPost() 
    .Where(post => post.TagsAsSlugs.Any(postTag => postTag == slug)) 
    .OrderByDescending(post => post.PublishAt) 
    .Paging(CurrentPage, DefaultPage, PageSize) 
    .ToList(); 

La méthode d'extension Where appelle TagsAsSlugs et effectue un Any, TagsAsSlugs ressemble à ceci.

public IEnumerable<string> TagsAsSlugs 
    { 
     get 
     { 
      if (Tags == null) 
       yield break; 
      foreach (var tag in Tags) 
      { 
       yield return SlugConverter.TitleToSlug(tag); 
      } 
     } 
    } 

Donc, puisque les boucles propriété TagsAsSlugs sur la collection d'étiquettes ne la requête exige que tous les messages sont renvoyés de sorte que chaque poste peut avoir sa collection Tags itéré?

Je doute que ce soit le cas puisque Oren's blog est si rapide.

Répondre

1

Jackson, Non, ce n'est pas comment cela fonctionne. Nous faisons le travail pendant l'indexation (le TagsAsSlugs est réellement calculé lors de la sauvegarde), puis nous sauvegardons TagsAsSlugs dans l'index. Nous interrogeons l'index pour les étiquettes qui y existent.

En bref, nous ne faisons aucun calcul, certainement pas du côté client.