2014-10-22 2 views
1

Я пытаюсь исключить результаты поиска, у которых есть поле, в котором хранится идентификатор элемента, пуст. Это поле, например, называется «типом». Я не смог это сделать, используя LINQ. Вот мой пример кода.Поиск пустых полей

public class SearchItem : SearchResultItem 
{ 
    [IndexField("type")] 
    public string Type{ get; set; }  
} 

public class Search 
{ 
    public static IEnumberable<Item> GetItems() 
    { 
     List<Item> items = new List<Item>(); 
     var index = ContentSearchManager.GetIndex(new SitecoreIndexableItem(Sitecore.Context.Item)); 
     using (var context = index.CreateSearchContext()) 
     { 
      var indexItems = context.GetQueryable<SearchResultItem>() 
       .Where(x => !string.IsNullOrEmpty(x.Type)) 
       .OrderByDescending(x => x.ReleaseDate); 

      foreach(var indexItem in indexItems) 
      { 
       var tempItem = indexItem.GetItem(); 
       items.Add(tempItem); 
      } 
     } 
     return items; 
    } 
} 

Пустые строки сравнения не работают, и в коллекции предметов содержатся элементы с пустыми строками для поля Тип. Я использую настройки Box для Lucene.

Также, если вы видите что-то не так, проколите отверстия в моем коде. Это мой первый раз с Sitecore 7 Search.

+0

Я не 100% на этом, но я не думаю, что можно сделать отрицательные совпадения в Lucene, как, например, с SQL. Используя IsNullOrEmpty, вы говорите, что вам нужно идентифицировать значения null/empty в индексе, но они никогда не были бы добавлены в индекс в первую очередь, так что ничего не подойдет. Итог, я не думаю, что вы можете проверить на отсутствие –

ответ

1

Не уверен, что если string.IsnullOrEmpty поддерживается Sitecore Linq, попробуйте Var indexItems = context.GetQueryable() .где (х => x.Type! = NULL) .OrderByDescending (х => x.ReleaseDate);

+0

Не могли бы вы прокомментировать, если я ошибаюсь, просто понижая ответ, это не хорошо для людей, которые читают это. –

+0

Не знаете, кто его понизил, но ваш ответ правильный. Вот как я закончил использовать мой код. Я поддержал его, чтобы удалить минус :) – Gabbar

+0

отлично! рад, что ты это сделал! благодаря! –

0

Sitecore и Lucene не поддерживают пустые строки, поскольку пустое поле не находится в индексе. В индексе для документа нет документа. Этот пост может помочь вам в использовании запросов Range.

Sitecore + Lucene Search FieldQuery with and empty string

0

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

protected bool checkType(SearchResultItem Ritem) 
    { 
     if (Ritem.type != null || !string.IsNullOrEmpty(Ritem.type)) 
     { 
      return true; 
     } 
     return false; 
    } 
0

Вы можете попытаться изменить где условие

public class SearchItem : SearchResultItem 
{ 
    [IndexField("type")] 
    public string Type{ get; set; }  
} 

public class Search 
{ 
    public static IEnumberable<Item> GetItems() 
    { 
     List<Item> items = new List<Item>(); 
     var index = ContentSearchManager.GetIndex(new SitecoreIndexableItem(Sitecore.Context.Item)); 
     using (var context = index.CreateSearchContext()) 
     { 
      var indexItems = context.GetQueryable<FRBSearchResultItem>() 
       .Where(x => !string.IsNullOrEmpty(x["type"])) 
       .OrderByDescending(x => x.ReleaseDate); 

      foreach(var indexItem in indexItems) 
      { 
       var tempItem = indexItem.GetItem(); 
       items.Add(tempItem); 
      } 
     } 
     return items; 
    } 
} 
0

Это может быть слишком поздно для ответа, но может помочь будущим читателям с той же проблемой.

Я использую предикат строитель следующим образом,

faqPredicate = faqPredicate.And(x => x.FAQAudience != null); 

Это приводит ниже ошибки

Сообщение: Сравнение нулевых значений не поддерживается. Источник: Sitecore.ContentSearch.Linq.Lucene

Так что исправить это при индексировании вместо строки return.Empty я использовал return «null»;

и в предикате я проверил,

faqPredicate = faqPredicate.And(x => x.FAQAudience != "null"); 

Да, это временное решение, но это работает. Я также попытался сравнить с string.Empty, но это не сработало