Hay*_*man 3 c# linq lucene.net sitecore sitecore8
我在Lucene索引中有一组课程,其中包含零个或多个可用日期。我正在尝试查询索引,以便返回任何可用日期介于从/到日期之间的课程。
使用我的CourseSearchResultItem中的属性,将该字段作为DateTime对象的集合带回
public class CourseSearchResultItem : SearchResultItem
{
[IndexField("availabledatesforcourse")]
public IEnumerable<DateTime> AvailableDatesForCourse { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
正在构造的查询使用以下代码:
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));
Run Code Online (Sandbox Code Playgroud)
运行此命令将产生以下异常:
任何通话中都不支持的lambda。使用的表达式'd =>(d> =值(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;}
}
Run Code Online (Sandbox Code Playgroud)
现在将查询更改为以下形式:
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));
Run Code Online (Sandbox Code Playgroud)
这种语法适用于在搜索文档中多次存储的值(例如,_path字段,该字段单独存储所有父项的GUID)。ContentSearch API会将其转换为Lucene可以理解的查询,如下所示:
AvailableDatesForCourse:<your date>
Run Code Online (Sandbox Code Playgroud)
更新的[IgnoreIndexFieldAttribute]将阻止映射错误时ContentSearch滋润你的类,但不会阻止在查询中使用的领域。我写了一个LinqScratchPad 要点来说明这一点,您可以通过将其粘贴或使用URL提取按钮将其加载到Sitecore LinqScratchPad的/sitecore/admin/LinqScratchPad.aspx中。这将查找名称中具有“ Media Item”的所有项目:
| 归档时间: |
|
| 查看次数: |
898 次 |
| 最近记录: |