2015-05-18 5 views
1

Где-то между Sitecore 7.2 и 8.0 сохранена измененная логика того, как изменились пустые поля даты (то есть поля даты, для которых редактор содержимого не выбрал значение). Они были сохранены как DateTime.MinValue (то есть 00010101); однако теперь они хранятся как пустая строка. Под Sitecore 7.2 я использовал, чтобы иметь возможность запускать следующую строку кода, чтобы найти все элементы, которые не имеют никакого значения, выбранного для данного поля даты:Поиск пустых полей даты в индексе

var myQuery = _searchContext.GetQueryable<MyClass>.Where(item => item.MyDateField == DateTime.MinValue); 

вызвавшего последующих Lucene запрос: +mydatefield: 00010101

Это конечно, больше не работает, поскольку значение поля в индексе является пустой строкой. Я не совсем уверен, как использовать API ContentSearch для настройки запроса, поскольку DateTime нельзя сравнивать с нулевым или пустым строковым значением. Мне интересно, есть ли способ запросить этот новый формат или мне нужно изучить, как Sitecore хранит пустые значения даты в соответствии со старым форматом.

+0

Можете ли вы попытаться добавить строковое свойство в свой 'MyClass' под названием' MyDateStringField' и использовать его для этого пустого поиска даты. Любой может использовать ваш «MyDateField» для всех других операций? –

+0

К сожалению, это не сработало. 'MyDateStringField ==" "' переведен на '+ MatchNoDocsQuery []' – Kyle

ответ

2

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

using System; 
using Sitecore.ContentSearch; 
using Sitecore.ContentSearch.ComputedFields; 
using Sitecore.Data.Fields; 
using Sitecore.Data.Items; 

namespace YourProject.ComputedFields 
{ 
    public class HasDateComputedIndexField : IComputedIndexField 
    { 
     public object ComputeFieldValue(IIndexable indexable) 
     { 
      Item item = indexable as SitecoreIndexableItem; 
      const string dateFieldName = "MyDateField"; 

      return 
       item != null && 
       item.Fields[dateFieldName] != null && 
       !((DateField)item.Fields[dateFieldName]).DateTime.Equals(DateTime.MinValue) && 
       !((DateField)item.Fields[dateFieldName]).DateTime.Equals(DateTime.MaxValue); 
     } 

     public string FieldName { get; set; } 

     public string ReturnType { get; set; } 
    } 
} 

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

public class MyClass : PageSearchResultItem 
{ 
    [IndexField("has_date")] 
    public bool HasDate { get; set; } 
} 

var myQuery = _searchContext.GetQueryable<MyClass>.Where(item => item.HasDate); 
0

Я считаю, что вы можете использовать обнуляемый DateTime (? DateTime) для поля, которое должно затем иметь никакого значения, когда данные пустые.

Возможно, ваш чек будет таким же простым, как проверка свойства HasValue.

var myQuery = _searchContext.GetQueryable<MyClass>.Where(item => item.MyDateField.HasValue); 
Смежные вопросы