Dynami c списки в Linq Query - solr - Sitecore - PullRequest
0 голосов
/ 01 мая 2020

Итак, вот сводка:

Sitecore - запрос индекса SOLR

У меня есть элементы, которые я пытаюсь получить, используя набор сайтов, которые могут различаться.

У меня есть запрос:

query = query.Where(x => x.Language == this.ItemLanguage)
             .Where(x => x.Templates.Contains(new Guid("94c1f3e5ac174a319cc5bbb942fe80c6")));

, который вернет все элементы правильно.

Мне нужно добавить динамический c список вызовов для этого запроса.

Что-то вроде:

.Where(x => x.Site.Any(y => siteNames.Contains(y)));

Я попытался добавить эту строку кода и получаю сообщение об ошибке:

System.ArgumentException: «Аргумент должен быть массивом»

(некоторые подробности)

Возвращенные элементы (x) имеют поле "Сайт" из List<string>

siteNames - это List<String> переменных имен сайтов

Следующий код работает в других местах:

.Where(x => x.Site.Contains("somesite"));

Есть ли способ управления динамическим списком c или мне нужно будет вручную генерировать это выражение на основе количества элементов в siteNames list?

.Where(x => x.Site.Contains("dynamic") || x.Site.Contains("dynamic")
         || x.Site.Contains("dynamic") || x.Site.Contains("dynamic") 
         || and so on);

Вот полный пример кода:

using (var context = Sitecore.ContentSearch.ContentSearchManager.GetIndex(AccelConstants.SEARCH_INDEX).CreateSearchContext())
{
            IQueryable<SearchResultModel> query = context.GetQueryable<LMSSearchResultModel>();
            SearchResults<SearchResultModel> results = null;
            List<string> siteNames = new List<string>();
            siteNames = this.SiteNames;
            // Define the base search
            query = query.Where(x => x.Language == this.ItemLanguage)
                         .Where(x => x.Templates.Contains(new Guid("94c1f3e5ac174a319cc5bbb942fe80c6")))
                         .Where(x => x.Site.Any(p => siteNames.Contains(p)));

            // Execute the query
            results = query.GetResults();
}

поле сайта - это поле solr для Site_SM, которое выдает вот так: Причина использования имени «Сайт» в том, что Сайты - это тоже поле. Это не тот код, который я контролирую, поэтому я работаю с тем, что имею.

"site_sm": ["login", "admin", "service", "covid19", "scheduler" "," system "," publisher "],

Модель результатов поиска просто преобразует вычисленные поля solr в c#

public class SearchResultModel : SearchResultItem
{
    [IndexField("_templates")]
    public List<Guid> Templates { get; set; }

    [IndexField("site_sm")]
    public List<string> Site { get; set; }
}

1 Ответ

0 голосов
/ 01 мая 2020

ОК, так что это довольно взломанный способ заставить мой поиск работать.

using (var context = Sitecore.ContentSearch.ContentSearchManager.GetIndex(AccelConstants.SEARCH_INDEX).CreateSearchContext())
{
     IQueryable<SearchResultModel> query = context.GetQueryable<LMSSearchResultModel>();
     SearchResults<SearchResultModel> results = null;
     List<string> siteNames = new List<string>();
     siteNames = this.SiteNames;

     // Define the base search
     // remove site filtering from query
     query = query.Where(x => x.Language == this.ItemLanguage)
                  .Where(x => x.Templates.Contains(new Guid("94c1f3e5ac174a319cc5bbb942fe80c6")));

     // Execute the query
     results = query.GetResults();

     // Get the results
     foreach (var hit in results.Hits)
     {
           //move site filter code to here
           if (hit.Document != null && hit.Document.Site.Any(p => siteNames.Contains(p)))
           {
                // Add the model to the results.                     
           }
           else
           {

           }
     }
}

Перемещая код фильтра сайта после запроса, создается экземпляр сайта List<string>, который имеет значение в время звонка. Похоже, это была моя проблема.

Это позволяет мне фильтровать по сайтам в siteNames List<string> и получать мой окончательный набор результатов.

Я не знаю, так ли это лучший способ заставить этот раздел кода работать, но он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...