如何在IQueryable中使用DbFunctions进行Lucene索引搜索

时间:2017-03-06 08:24:58

标签: c# lucene sitecore sitecore8

我使用以下代码从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; }
    }

2 个答案:

答案 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,您可能会看到更好的视图