其他分享
首页 > 其他分享> > IEnumerable字段查询Lucene索引

IEnumerable字段查询Lucene索引

作者:互联网

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

使用我的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));

运行此命令将产生以下异常:

Unsupported lambda in Any call. Expression used ‘d => (d >= Value (RCS.Web.Areas.RcsEng.Controllers.CoursesApiController +<>c__DisplayClass10_0).courseSearchCriteria.FromDate.Value)’

我知道这是Sitecore.Linq Any()方法的局限性的结果,但是不确定如何重新创建所需的功能.是否有人有类似的问题可以阐明解决方案?

解决方法:

尝试以下方法.

更改您的班级,使其看起来像这样:

 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>

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

LinqScratchPad example

标签:sitecore8,sitecore,lucene-net,linq,c
来源: https://codeday.me/bug/20191027/1946940.html