我使用以下代码从Lucene索引获取结果。
using (var context = ContentSearchManager.GetIndex("my_profile_index").CreateSearchContext())
{
IQueryable<ProfileSearchItem> query = from profile in context.GetQueryable<ProfileSearchItem>()
where profile.LastName.Equals("Zafar")
let diffYears = DbFunctions.DiffYears(profile.Birthdate, DateTime.Today)
select profile;
return query.ToList();
}
由于DbFunctions.DiffYears
:
Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.
如果我不在上述查询中使用DbFunctions
,我会得到一条记录。我想知道在搜索索引时如何使用DbFunctions
。这只是一个示例查询,我的唯一目标是标题中提到的。
ProfileSearchItem
上课:
public class ProfileSearchItem
{
[IndexField("_group")]
public string ItemId { get; set; }
[IndexField("_language")]
public string Language { get; set; }
[IndexField("birthdate")]
public DateTime Birthdate { get; set; }
[IndexField("first_name")]
public string FirstName { get; set; }
[IndexField("last_name")]
public string LastName { get; set; }
}
答案 0 :(得分:0)
我不认为查询喜欢在其中包含函数,并且查询解析器正在尝试将其转换为某些内容。
在您的情况下,您可以在POCO上查询之后计算年份差异。
在您的ProfileSearchItem POCO上有一个属性;
public int YearsDifference { get { return Datetime.Now.Year - Birthdate.Year;} }
答案 1 :(得分:0)
日期字段在Lucene中保存为字符串,如20170308,因此许多数据方法甚至不会像比较[DateField]那样简单。因此我猜DbFunctions.DiffYears正在做一些lambda表达式并使用日期方法填充结果。
查看https://ggullentops.blogspot.com.au/2015/12/sitecore-lucene-index-and-datetime.html,您可能会看到更好的视图