sitecore开发入门Sitecore的CRUD操作 - 第二部分

时间:2023-03-09 16:01:24
sitecore开发入门Sitecore的CRUD操作 - 第二部分

在上一篇(sitecore开发入门Sitecore的CRUD操作 - 第一部分)中我们讨论了如何使用Sitecore Item API,Glass,Fortis和Synthesis在Sitecore中创建项目。在这篇文章中,我们将重点关注Item API,在下一个会话中,我们将更多地关注ORM包装器以读取该数据。分裂的原因是因为Sitecore Item API在所有其他ORM中都是必不可少的(尽管ORM的一些提取了Sitecore Item API的复杂性)。

Sitecore Item API

使用Sitecore API从Sitecore中提取项目时,实际上有四种方法:Sitecore查询,快速查询,Lucene查询或ItemProvider中的直接GetItem调用。

Sitecore查询

一般情况下,您现在希望避免使用Sitecore Query从Sitecore提取数据,但有时在Sitecore内容编辑器中它可能有意义,尤其是在将其用作Multilist或其他类型的item字段的Source时。下面显示了一些如何编写典型Sitecore查询的示例。我希望将来写一篇关于编写Sitecore查询的完整文章,即使我认为现在有更好的方法来阅读sitecore项目,知道如何编写Sitecore查询仍然很重要,因为它们在整个Sitecore平台上使用。

一个基本的Sitecore查询:

 query:/sitecore/content/#site-1#/*

上面的示例表示您可能创建并运行的相当常见的Sitecore查询。有一点需要知道,你必须在查询中转义连字符,为此,你可以将它们包装在#符号中,如上所示。

 query:/sitecore/content//*

上面的示例与第一个示例类似,不同之处在于// *而不是/ *。// *将查看当前文件夹并递归搜索该文件夹下的每个文件夹,以查找您要搜索的任何条件。在此示例中,您将以递归方式为内容项下面的所有内容构建项列表(这样效率极低)。/ *只会查找当前项目的子项,然后看起来不比那更深。

 query:/sitecore/content//*[@@templateid='{guid}']

在最后一个示例中,这将展示如何递归搜索当前内容文件夹的所有后代,并仅按具有与您传入的过滤器匹配的模板ID的项过滤结果。

关于Sitecore查询的一些其他限制是,它只能返回一定数量的结果。默认情况下,它只返回100个结果,但显然您可以通过修补以下配置设置来增加该数量:

<setting name="Query.MaxItems>
  <patch:attribute name="value">250</patch:attribute>
</setting>

快速查询

快速查询与Sitecore查询非常相似,但在使用数千个项目时,与使用较小的项目子集(通常少于100个项目)相比,快速查询是更好的选择。然而,快速查询还有一些限制。由于它的工作原理,它会在找到结果时返回结果,并且它们不会按照它们在树中找到的顺序出现。这可能会导致问题,这也是快速查询作为一种拉取数据的方式并不常见的主要原因之一。如果您正在使用内容树但不能使用一些更好的选项,例如我们将在一秒钟内描述的Lucene,并且您只需要所有数据,那么快速查询可能是一个不错的选择。

快速查询的另一个问题是Sitecore查询实际上允许更多选项来过滤结果,而快速查询将限制您可以返回的内容。语义上唯一真正的区别是,不是在查询前加上“query:”,而是用“fast:”作为前缀。

Lucene与SOLR

在我看来,这是从您的网站提取数据的首选方式,尤其是面向您网站部分的访问者,这些部分通常会看到更多的流量。Lucene与众不同,它实际上并不是Sitecore技术,只是Sitecore和Lucene之间的结合,它允许更快的方式从树中的任何地方获取项目(只要它们在索引中)。索引是从树中构建的文档集合。通常,当您向树中添加内容时,项目将添加到索引中(保存时为master,发布时为Web索引)。如果您有自定义索引,则这些索引可能会因您使用的索引重建策略而异。

要开始在lucene中编写查询,您需要使用Linq to Lucene提供程序,以便您可以编写简单的.net linq语句,这些语句将在后台转换为Lucene查询。要开始,您可以编写如下内容:

using (var context = Sitecore.ContentSearch.ContentSearchManager.GetIndex("sitecore_web_index").CreateSearchContext())
{
    // Build Query
    var query = context.GetQueryable<SearchResultItem>();
    // Perform a Search
    query = query.Where(i => i.Name == "Hello World");
    // Materialize the Results
    var results = query.GetResults();
}

从上面的例子中可以注意到一些事项。首先是第一行,该行使用sitecore_web_index构建搜索上下文。但是,您可能并不总是想要使用此索引。如果您希望索引根据当前上下文项的上下文而变化,您可以使用:

using (var context = Sitecore.ContentSearch.ContentSearchManager.CreateSearchContext(new Sitecore.ContentSearch.SitecoreIndexableItem(Sitecore.Context.Item)))
{
    // Query Here
}

此替代方法允许您使用上下文项来确定使用的索引。因此,如果您正在使用体验编辑器并且它正在提取数据,那么它将是该上下文中的主索引,否则如果您正在查看该网站,则您将使用Web索引。

其次,要讨论的一个重要主题是如何查询自定义字段或模板中的数据。因此,从上面的示例中,我们使用了GetQueryable <SearchResultItem>()。SearchResultItem是一种基本类型,表示您可能希望从索引中查询的公共项字段。但是,您可能会发现需要搜索其他字段,例如,如果您有文章模板,并且需要基于类别进行搜索,该类别是在网站核心中存储ID的DropList字段。要做到这一点,您需要创建一个新的POCO类来表示您需要提取的数据。然后,您将使用数据属性将索引字段映射到您要定义的属性。像这样的东西例如:

public class ArticleSearchItem : SearchResultItem
{
    [IndexField("categoryid")]
    [TypeConverter(typeof(IndexFieldIDValueConverter))]
    public ID CategoryId { get; set; }
}

最后在最后一行,您将调用query.GetResults()。此方法返回一个具有名为Hits的属性的对象。这表示找到的与您的搜索请求匹配的数据。