在使用Sitecore内容搜索与Lucene同时返回单个项目时出现错误

本文关键字:单个 返回 项目 错误 Lucene Sitecore 搜索 | 更新日期: 2023-09-27 18:11:23

我正在做从Wordpress到Sitecore 7.2的博客迁移&用c#写了一个脚本来创建项目。为了防止重复项,我创建了一个扩展方法来检查是否已经有项。

/// <summary>
/// Check if item with given name exists as child & if yes,return that item
/// </summary>
/// <returns></returns>
public static Item GetItemIfExists(this Item parentItem, string itemName)
{
  Item childItem = null;
  using (var context = Constants.Index.CreateSearchContext())
  {
     childItem = context.GetQueryable<SearchResultItem>().Where(i => i.Path.Contains(parentItem.Paths.FullPath) && i.Name == itemName).Select(i => (Item)i.GetItem()).FirstOrDefault();
  }
  return childItem;
}

此方法使用Sitecore的内容搜索功能,但抛出以下错误:

错误类型:System.Linq.IQueryable 1[[Sitecore.Data.Items.Item, Sitecore.Kernel, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null]]. Expected: System.Linq.IQueryable 1[[Sitecore.ContentSearch.SearchTypes.SearchResultItem,]Sitecore。内容搜索,版本=1.0.0.0,文化=中性,都必须= null]]

然而,如果我像下面这样修改方法,它会工作得很好:

            /// <summary>
            /// Check if item with given name exists as child & if yes,return that item
            /// </summary>
            /// <returns></returns>
            public static Item GetItemIfExists(this Item parentItem, string itemName)
            {
                var childItem = new List<Item>();
                using (var context = Constants.Index.CreateSearchContext())
                {
                    childItem = context.GetQueryable<SearchResultItem>().Where(i => i.Path.Contains(parentItem.Paths.FullPath) && i.Name == itemName).Select(i => (Item)i.GetItem()).ToList();
                }
                return childItem.FirstOrDefault();
            }

从Sitecore的内容搜索中返回单个条目的最佳方法是什么?

在使用Sitecore内容搜索与Lucene同时返回单个项目时出现错误

尝试使用.Where(i => i.Path.Contains(parentItem.Paths.FullPath) && i.Name == itemName).Take(1).ToList()

请记住,查询是在枚举之前组装的,因此一旦调用ToList或Select,查询就被发送到搜索索引并枚举,从那时起您就不能修改查询(因为它已经被发送),因此linq语句的顺序很重要。

你可以在例子中看到,我们在枚举之前调用Take()(限制调用)。

您也可以查看search.log' in your日志目录来查看查询之间的差异。

如果你以前使用过LinqPad,我会推荐(Adam Conn的LinqPad Connector for Sitecore ContentSearch),它将允许你对自己的搜索索引进行linq查询实验。