在返回单个项目时使用Lucene进行Sitecore内容搜索时出错

时间:2014-07-04 13:24:39

标签: c# linq lucene sitecore sitecore7

我正致力于从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.ContentSearch,Version = 1.0.0.0,Culture = neutral,   公钥=空]]

然而,如果我修改方法如下,它可以正常工作:

            /// <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的内容搜索中返回单个项目的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

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

请记住,在枚举之前汇总了查询,因此只要您调用ToList或选择将查询发送到搜索索引并进行枚举,从那时起您就无法修改查询(因为它已经被发送),所以linq语句的顺序很重要。

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

您可以查看search.log' in your logs`目录以查看查询之间的差异。

如果您在我推荐(Adam Conn's LinqPad Connector for Sitecore ContentSearch)之前使用过LinqPad,它将允许您针对自己的搜索索引尝试linq查询。