这个RavenDB linq查询是如何工作的

时间:2012-02-26 15:25:31

标签: linq ravendb

我正在查看RacoonBlog的源代码,试图在RavenDB中找到一种方法来查询文档中包含的集合。我读过有关索引和Map / Reduce的内容,但未能找到答案。

在PostsController中有一个名为Tag的ActionResult,它接受一个字符串参数并包含以下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属性循环遍历标记集合,所以查询要求返回所有帖子,以便每个帖子可以迭代其Tags集合吗?

我怀疑是这种情况,因为Oren's blog如此之快。

1 个答案:

答案 0 :(得分:1)

杰克逊 不,这不是它的工作原理。我们在索引期间完成工作(TagsAsSlugs实际上是在节省时间计算的),然后我们将TagsAsSlugs保存到索引中。 我们查询索引中存在的标记。

简而言之,我们不做任何计算,当然也不在客户端。