ToString()替代索引搜索(C#转换为SQL)

时间:2015-04-30 12:30:59

标签: c# sql sitecore iqueryable

我目前在Sitecore(Sitecore 8 Update 2)项目中有以下内容:

var index = ContentSearchManager.GetIndex("sitecore_web_index");
IQueryable<SearchResultItem> queryCalls = index.CreateSearchContext().GetQueryable<SearchResultItem>().Where(item =>
                 item.TemplateName == callTemplateName &&
                 item.Path.StartsWith(callStartingPath) && 
                 item.Language == Sitecore.Context.Language.Name &&
                 item.Fields["appliedthemes"].ToString().Contains(themeID))

这应该给我一些特定路径下的所有项目,并且具有特定语言的某个templatename(工作正常)。 最后一行确保仅返回具有特定标记的项目。

然而,似乎我不能在最后一个语句中使用ToString()方法,因为这不能转换为SQL。但我无法找到另一种方式来写这篇文章。

编辑:

错误

Server Error in '/' Application.
The method 'ToString' is not supported. Declaring type: System.Object
Description: An unhandled exception occurred.

Exception Details: System.NotSupportedException: The method 'ToString' is not supported. Declaring type: System.Object

2 个答案:

答案 0 :(得分:4)

这不是LINQ to SQL因此查询不会转换为SQL,而是将其转换为基础搜索提供程序(Lucene,Solr,Coveo等)的查询。

正如您所发现的那样,不支持调用.ToString(),但也不需要调用var index = ContentSearchManager.GetIndex("sitecore_web_index"); using (var context = index.CreateSearchContext()) { IQueryable<SearchResultItem> queryCalls = context.GetQueryable<SearchResultItem>().Where(item => item.TemplateName == callTemplateName && item.Path.StartsWith(callStartingPath) && item.Language == Sitecore.Context.Language.Name && item["appliedthemes"].Contains(themeID)) } 。您可以调用索引器并直接获取字段值:

Item

item.Fields["Field Name"].Value项类有一个索引器,它将返回字段的字符串值。如果字段不存在于项目上,它还有返回空字符串的好处(如果字段不存在,则调用string GetFilterExpressionForName(string input) { string trimmed = input.Trim(); return string.Format("NAME LIKE '{0}' OR NAME LIKE '{1}' OR NAME LIKE '{1}'", trimmed, trimmed.Replace(' ', '-'), trimmed.Replace(' ', '_')); // TODO: remove/replace wildcards from user input } 会导致NullReference异常)。

答案 1 :(得分:1)

假设appliedthemes字段是单行,多行或富文本字段,我建议您创建自己的继承自SearchResultItem的类。

public class TaggedItem : SearchResultItem 
{
    [IndexField("appliedthemes")]
    public string AppliedThemes { get; set; }
}

如果您的字段恰好是多值字段,则可以使用IEnumerable<T>属性来表示值。无论哪种方式,现在您已经定义了自己的类,您可以按如下方式使用它:

var index = ContentSearchManager.GetIndex("sitecore_web_index");
using (var context = index.CreateSearchContext())
{
    var queryCalls = context.GetQueryable<TaggedItem>()
            .Where(item => item.TemplateName == callTemplateName)
            .Where(item => item.Path.StartsWith(callStartingPath))
            .Where(item => item.Language == Sitecore.Context.Language.Name)
            .Where(item => item.AppliedThemes.Contains(themeID));

    //...

}