我目前在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
答案 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));
//...
}