我正在尝试将搜索字段添加到我的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
代码编译好吗?据我所知,并不需要构造函数参数。
SearchFields
没有被SearchParameters
构造函数初始化(参见源代码here),因此在其上调用Add
将导致NullReferenceException
。它的类型为IList
,因此初始化它的最简单方法是为其分配一个数组,如下所示:
searchParameters.SearchFields = new[] { "StoreNumber", "StoreName" };
几种可能性(取决于您的对象实现):
这里:
SearchParameters searchParameters = new SearchParameters();
searchParameters.SearchFields.Add("StoreNumber");
searchParameters.SearchFields.Add("StoreName");
SearchFields
是List
吗?它是在SearchParameters
建设期间初始化的吗?如果没有,在这种情况下,当您将项目添加到未实例化的内容时,您可以拥有NullReferenceException
。
或者在这里:
List<SearchHit> searchHits = results.Results.Select(r => ResultMapper.ToSearchHit(r)).ToList();
在你的results
对象中,你确定Results
被实例化了吗?如果没有,NullReferenceException
要查找抛出异常的行,请查看代码中的第32行(行号在错误日志中)