在Sitecore
我们有包含multilist
字段的项目。该字段已存储并编入索引,因此我们可以使用此语法查询它们。
using (var context = ContentSearchManager.GetIndex("sitecore_web_index").CreateSearchContext())
{
var templateId = new ID(Config.NewsTemplate);
var q = context.GetQueryable<NewsSearchResultItem>().Where(x => x.Language == searchContext.Language && x.TemplateId == templateId);
var appIdPrd = PredicateBuilder.True<NewsSearchResultItem>();
foreach (var t in searchContext.AppIds)
{
var id = GetId(t);
appIdPrd = appIdPrd.Or(p => p.AppIdOr.Contains(id));
}
q = q.Where(appIdPrd);
List<NewsItem> items = new List<NewsItem>(q.Count());
}
class NewsSearchResultItem : SearchResultItem
{
public string Title { get; set; }
public string Body { get; set; }
[IndexField("apps_or")]
public List<ID> AppIdOr { get; set; }
}
当项目在multilist
字段apps_or中有一个或多个值时,它会起作用。但我也想搜索multilist
字段中没有项目的项目。
这永远不会退货:
q = q.Where(x => x.AppIdOr.Count == 0);
并且不允许这样做:
q = q.Where(x => x.AppIdOr == null);
任何想法?
答案 0 :(得分:2)
Lucene不知道如何搜索空值,因为没有为lucene搜索索引的值。 我建议在索引时,如果字段为空/ null(使用自定义或计算字段),则添加默认值,例如(ID.Null),然后在搜索查询中,您可以搜索ID.Null。 之前没有尝试过,但我认为它会起作用。