Как работает этот запрос RavenDB linq - PullRequest
3 голосов
/ 26 февраля 2012

Я искал исходный код для RacoonBlog , пытаясь найти способ в RavenDB запрашивать коллекцию, содержащуюся в документе. Я прочитал об индексах и Map / Reduce и не смог найти ответ.

В PostsController есть ActionResult с именем Tag, который принимает строковый параметр и содержит следующий запрос linq.

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();

Метод расширения Where вызывает TagsAsSlugs и выполняет Any, TagsAsSlugs выглядит следующим образом.

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

Таким образом, поскольку свойство TagsAsSlugs зацикливается на коллекции тегов, требует ли запрос, чтобы все сообщения были возвращены, чтобы у каждого сообщения могла быть повторена коллекция тегов?

Я сомневаюсь, что это так, поскольку Блог Орена очень быстрый.

1 Ответ

1 голос
/ 26 февраля 2012

Джексон, нет, это НЕ так, как это работает.Мы делаем работу во время индексации (TagsAsSlugs фактически вычисляется на время сохранения), а затем мы сохраняем TagsAsSlugs в индекс.Мы запрашиваем индекс для существующих там тегов.

Короче говоря, мы не делаем никаких вычислений, конечно же, не на стороне клиента.

...