基本嵌套索引

Basic nested Index

我想创建一个基本的嵌套索引,它只包含包含文档的 ID 和嵌套数据。按照 ravenDb 文档我做了如下操作:

 public class LeaguesIndex : AbstractIndexCreationTask<CommunityDocument>
{
    public class Result
    {
        public string CommunityId { get; set; }
        public Domain.TeamLeague League { get; set; }
    }

    public LeaguesIndex()
    {
         Map = communities => from community in communities
            from league in community.TeamLeagues
            select new
            {
                CommunityId = community.Id.Replace("CommunityDocuments/", string.Empty),
                League = league
            };
    }
}

并查询:

 var leagues = session
                .Query<LeaguesIndex.Result, LeaguesIndex>()
                .Where(x => x.CommunityId == input.Id)
                .OfType<CommunityDocument>()
                .ToList();

这确实产生了一个结果,除了结果包含整个 CommunityDocument。我该怎么做才能得到 LeaguesIndex.Result class? (我尝试删除 'OfType' 行,但它不喜欢它。)

编辑 - 这是有效的:

public class LeaguesIndex : AbstractIndexCreationTask<CommunityDocument, LeaguesIndex.Result>
{
    public class Result
    {
        public string CommunityId { get; set; }
        public Domain.League League { get; set; }
    }

    public LeaguesIndex()
    {
         Map = communities => from community in communities
            from league in community.TeamLeagues
            select new
            {
                CommunityId = community.Id.Replace("CommunityDocuments/", string.Empty),
                League = league
            };
        StoreAllFields(FieldStorage.Yes);
    }
}

查询:

var lastLeague = session
            .Query<LeaguesIndex.Result, LeaguesIndex>()
            .Where(x => x.CommunityId == input.Id)
            .AsProjection<LeaguesIndex.Result>()
            .LastOrDefault();

对于 RavenDB 3.5,你应该使用 ProjectFromIndexFieldsInto:

var lastLeague = session
    .Query<LeaguesIndex.Result, LeaguesIndex>()
    .Where(x => x.CommunityId == id)
    .ProjectFromIndexFieldsInto<LeaguesIndex.Result>()
    .LastOrDefault();

有关详细信息,请参阅 https://ravendb.net/docs/article-page/3.5/Csharp/client-api/session/querying/how-to-perform-projection

链接文档中的注释:

Projections request from server an array of fields to download, if index contains those fields (stores them) they will come directly from index, if not values from document will be used.

这意味着除非您将数据存储在索引中,否则将从文档中加载数据,从而降低性能。

假设 RavenDB 4.0 的旧答案:

使用ProjectInto<T>:

var leagues = session
    .Query<LeaguesIndex.Result, LeaguesIndex>()
    .Where(x => x.CommunityId == input.Id)
    .ProjectInto<LeaguesIndex.Result>()
    .ToList();

有关详细信息,请参阅 https://ravendb.net/docs/article-page/4.0/csharp/indexes/querying/projections#projectinto