Основной вложенный индекс - PullRequest
0 голосов
/ 04 мая 2018

Я хочу создать базовый вложенный индекс, который содержит только идентификатор содержащего документ и вложенные данные. Следуя документации 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? (Я пытался удалить строку «OfType», но она мне не понравилась.)

edit - это работает:

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

1 Ответ

0 голосов
/ 04 мая 2018

Для 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.

Примечание из связанной документации:

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

Это означает, что если вы не сохраните данные в индексе, данные будут загружены из документов, что приведет к снижению производительности.

Старый ответ, предполагающий 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.

...