查询针对IEnumerable字段的lucene索引

时间:2015-10-23 11:20:31

标签: c# linq sitecore lucene.net sitecore8

我在Lucene索引中有一组课程,其中包含零个或多个可用日期。我正在尝试查询索引,以便返回任何可用日期介于From / To日期之间的课程。

使用我的CourseSearchResultItem中的属性将该字段作为DateTime对象的集合返回

 public class CourseSearchResultItem : SearchResultItem
 {
     [IndexField("availabledatesforcourse")]
     public IEnumerable<DateTime> AvailableDatesForCourse { get; set;}
 }

正在构建的查询使用以下代码:

 if (courseSearchCriteria.FromDate.HasValue)
     query = query.Where(c => c.AvailableDatesForCourse.Any(d => d >= courseSearchCriteria.FromDate.Value));

 if (courseSearchCriteria.ToDate.HasValue)
     query = query.Where(c => c.AvailableDatesForCourse.Any(d => d <= courseSearchCriteria.ToDate.Value));

运行它会产生以下异常:

  

任何通话中不支持的lambda。表达式使用'd =&gt; (d> = = Value(RCS.Web.Areas.RcsEng.Controllers.CoursesApiController +&lt;&gt; c__DisplayClass10_0).courseSearchCriteria.FromDate.Value)'

我知道这是Sitecore.Linq Any()方法限制的结果,但我不确定如何重新创建所需的功能。有没有人有类似的问题可以解决一个问题?

2 个答案:

答案 0 :(得分:4)

请尝试以下操作。

将您的课程改为:

 public class CourseSearchResultItem : SearchResultItem
 {
     [IgnoreIndexFieldAttribute]
     [IndexField("availabledatesforcourse")]
     public DateTime AvailableDatesForCourse { get; set;}
 }

现在将您的查询更改为:

if (courseSearchCriteria.FromDate.HasValue)
     query = query.Where(c => c.AvailableDatesForCourse == courseSearchCriteria.FromDate.Value);

if (courseSearchCriteria.ToDate.HasValue)
 query = query.Where(c => c.AvailableDatesForCourse == courseSearchCriteria.ToDate.Value));

这种语法适用于在搜索文档中多次存储的值(例如,_path字段,它分别存储所有父项的GUID)。它将由ContentSearch API转换为查询 Lucene可以理解,像这样:

AvailableDatesForCourse:<your date>

更新当ContentSearch为您的类提供水分时,[IgnoreIndexFieldAttribute]将阻止映射错误,但不会阻止该字段在查询中使用。我写了一个LinqScratchPad Gist来说明这一点,您可以通过粘贴它或使用URL Fetch按钮将其加载到Sitecore LinqScratchPad / sitecore/admin/LinqScratchPad.aspx中。这将查找名称中包含“Media Item”的所有项目:

LinqScratchPad example

答案 1 :(得分:0)

我遇到了同样的问题,并遵循Dan的步骤,这使我成为了解决方案的一部分。我遇到的问题是SitecoreContentSearch正在创建Solr无法解析的查询。我将linq查询更新为:

if (courseSearchCriteria.FromDate.HasValue && courseSearchCriteria.ToDate.HasValue)
query= query.Where(x => x.AvailableDatesForCourse.Between(courseSearchCriteria.FromDate.Value,courseSearchCriteria.ToDate.Value,Inclusion.Both));

这应该创建一个如下查询:

availabledatesforcourse:[2018-07-13T15:48:42.975Z TO 2021-07-13T15:48:43.023Z]

这使我可以在日期列表中搜索该范围内的任何值。