Поиск объекта Azure SearchParameters Ссылка на объект не установлена ​​на экземпляр ошибки объекта - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь добавить поля поиска в свой поисковый запрос Azure (см. Ниже создание экземпляра объекта SearchParameters).

    public async Task StartAsync(IDialogContext context)
    {
        ISearchIndexClient indexClient = CreateSearchIndexClient();
        try
        {
            Trace.TraceInformation($"Starting StartAsync");
            SearchParameters searchParameters = new SearchParameters();
            searchParameters.SearchFields.Add("StoreNumber");
            searchParameters.SearchFields.Add("StoreName");
            Trace.TraceInformation($"Finished adding search fields");
           // Trace.TraceInformation($"Search Parameters added = {searchParameters.SearchFields.Count}");

            DocumentSearchResult results = await indexClient.Documents.SearchAsync(searchText, searchParameters);
            Trace.TraceInformation($"results obtained");

            List<SearchHit> searchHits = results.Results.Select(r => ResultMapper.ToSearchHit(r)).ToList();
            Trace.TraceInformation($"search hits {searchHits.Count}");
            await SendResultsOfSearch(context, results);
        }
        catch (Exception ex)
        {
            Trace.TraceError($"Exception {ex.ToString()}");
        }
    }

Почему-то выбрасывает следующее исключение, но я понятия не имею, почему?

2018-09-03T00:47:39  PID[3268] Information Starting StartAsync
2018-09-03T00:47:39  PID[3268] Error       Exception System.NullReferenceException: Object reference not set to an instance of an object.
   at LuisBot.Dialogs.SearchRBMDialog.<StartAsync>d__2.MoveNext() in C:\Users\jmatson\Downloads\retail-info-bot-v2-src\Dialogs\SearchRBMDialog.cs:line 32

Код компилируется нормально? Насколько я знаю, аргументы конструктора не требуются.

Ответы [ 2 ]

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

SearchFields не инициализируется конструктором SearchParameters (см. Исходный код здесь ), поэтому вызов Add для него приведет к NullReferenceException. Он имеет тип IList, поэтому его проще всего инициализировать, назначив ему массив, например:

searchParameters.SearchFields = new[] { "StoreNumber", "StoreName" };
0 голосов
/ 03 сентября 2018

Несколько возможностей (в зависимости от реализации ваших объектов):

Здесь:

SearchParameters searchParameters = new SearchParameters();
searchParameters.SearchFields.Add("StoreNumber");
searchParameters.SearchFields.Add("StoreName");

Является ли SearchFields a List? Это было инициализировано во время SearchParameters строительства? Если нет, то в этом случае вы можете иметь NullReferenceException, когда добавляете элементы к чему-то, что не было создано.

Или здесь:

List<SearchHit> searchHits = results.Results.Select(r => ResultMapper.ToSearchHit(r)).ToList();

В вашем results объекте вы уверены, что экземпляр Results создан? Если нет, NullReferenceException

Чтобы узнать, какая строка вызывает исключение, посмотрите строку 32 в вашем коде (номер строки указан в журнале ошибок)

...