Ravendb, пытающийся запросить дочерний объект, приводит к «не может индексировать не проиндексированное поле» - PullRequest
0 голосов
/ 27 сентября 2018

Я думаю, что класс будет понятен на основе индекса:

public class CalendarMatchIndex : AbstractIndexCreationTask<CalendarMatch>
    {

        public CalendarMatchIndex()
        {
            Map = matches => from match in matches
                select new
                {
                     match.CalendarId,
                     match.MatchDate,
                     match.CommunityId,
                     CategoryId = match.ImportData.CategoryId,
                     TeamTypeId = match.ImportData.TeamTypeId,
                     TeamSheetDeadline =match.ImportData.TeamSheetDeadline,
                     ActivityId =match.ImportData.ActivityId,

                };
        }
    }
}

Запрос:

var query = session.Query<CalendarMatch, CalendarMatchIndex>()
.Where(x => x.ImportData.CategoryId == input.CategoryId);

В результате возникает ошибка importdata.categoryid not indexed.Как запросить это поле, не прибегая к использованию отдельного класса результатов и сохраняя все поля?

edit: добавление Json:

{
    "CalendarId": "7ui824avw496",

    "ImportData": {
        "ActivityType": "Tournament",
        "ActivityId": "aqhfl52xbff137",
        "LinkedMatchId": "bykdzj5j11kagf"
    },
    "CommunityId": null
}

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Создайте класс результата со структурой, соответствующей результатам индекса:

public class CalendarMatchResult
{
    public string CalendarId { get; set; }
    public DateTime? MatchDate { get; set; }
    public string CommunityId { get; set; }
    public string CategoryId { get; set; }
    public string TeamTypeId { get; set; }
    public DateTime? TeamSheetDeadline { get; set; }
    public string ActivityId { get; set; }
}

Затем вы можете запросить индекс следующим образом:

var query = session.Query<CalendarMatchResult, CalendarMatchIndex>()
    .Where(x => x.CategoryId == input.CategoryId);

Вам не нужно хранитьполя, если вам не нужно извлекать их непосредственно для индекса.Для фильтрации поля, которые не сохраняются, просто хороши.

0 голосов
/ 28 сентября 2018

Если вы не хотите создавать класс результатов в прошлом (ravendb 2.5), я использовал этот синтаксис на карте:

Map = matches => from match in matches
                select new
                {
                     match.CalendarId,
                     match.MatchDate,
                     match.CommunityId,
                     ImportData_CategoryId = match.ImportData.CategoryId,
                     ImportData_TeamTypeId = match.ImportData.TeamTypeId,
                     ImportData_TeamSheetDeadline = match.ImportData.TeamSheetDeadline,
                     ImportData_ActivityId = match.ImportData.ActivityId,

                };

с этой картой ваш запрос должен работать:

var query = session.Query<CalendarMatch, CalendarMatchIndex>()
    .Where(x => x.ImportData.CategoryId == input.CategoryId);
0 голосов
/ 27 сентября 2018

Глядя на определение индекса, вы индексируете ImportData.CategoryId как поле CategoryId, и это означает, что ваш запрос должен выглядеть следующим образом:

var query = session.Query<CalendarMatch, CalendarMatchIndex>()
.Where(x => x.CategoryId == input.CategoryId);

См. x.ImportData.CategoryId -> x.CategoryId изменение в моемзапрос.

...