在上一篇(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的属性的对象。这表示找到的与您的搜索请求匹配的数据。

sitecore开发入门Sitecore的CRUD操作 - 第二部分的更多相关文章

  1. sitecore开发入门Sitecore的CRUD操作 - 第一部分

    在本文中,讨论如何使用Sitecore.Data.Items.Item并对这些项执行CRUD(创建,读取,更新和删除)操作.我还将介绍如何使用Glass和Fortis类库进行相同的操作,这些操作都是对 ...

  2. Asp.Net Web API 2(CRUD操作)第二课

    Asp.Net Web API 2(CRUD操作)第二课 Asp.Net Web API 导航   Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok ...

  3. sitecore开发入门之Sitecore字典结构最佳实践

    使用Sitecore时,一个重要的主题是如何为您的网站处理不同的语言和区域.Sitecore对此的回答是使用字典项,它基本上只代表键/值定义.但是,这个字典项可以设置为具有不同的语言版本,这几乎允许您 ...

  4. elasticsearch入门(简单的crud操作)

    记录一下,elasticsearch从创建索引到插入数据的一个crud操作. 一.创建索引 curl -XPUT "http://192.168.99.1:9200/productindex ...

  5. sitecore开发入门之如何在代码中获取SITECORE图像URL

    using Sitecore; using Sitecore.Data.Items; using Sitecore.Resources.Media; public string GetUrl() { ...

  6. sitecore开发入门教程如何获取Sitecore项目的域名

    我假设您在<sites>web.config文件的部分中设置了多个站点,并且每个站点都hostName定义了一个属性,例如 <site name="website1&quo ...

  7. 8天掌握EF的Code First开发系列之2 简单的CRUD操作

    本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 创建控制台项目 根据.Net中的类来创建数据库 简单的CRUD操作 数据库模式更改介绍 本章小结 本人的实验环境 ...

  8. 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)

    salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)   salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...

  9. SpringData JPA快速入门和基本的CRUD操作以及Specifications条件查询

    SpringData JPA概述: SpringData JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和操作 ...

随机推荐

  1. Python中的__init__和__new__

    一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: # -*- c ...

  2. HDU 2009 求数列的和

    题目链接:HDU 2009 Description 数列的定义如下: 数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和. Input 输入数据有多组,每组占一行,由两个整数n(n< ...

  3. WinIo驱动级键盘模拟编程

    转自:http://blog.sina.com.cn/s/blog_455d7a320100vr37.html 前天无聊,翻翻自己的兴趣项目文件夹,发现了这个放下很久的项目!那是大三时候的事了.当时是 ...

  4. ActiveMQ的安装与使用(单节点)

    1. 安装 JDK 并配置环境变量(略) JAVA_HOME=/usr/local/java/jdk1.7.0_72 2. 下载 Linux 版的 ActiveMQ $ wget http://apa ...

  5. file_get_contents 在本地测试可以, 但在服务器上报错403

    解决方法: Most likely if you don't get any content while accessing an webpage, probably it doesn't want ...

  6. python在读取文件时出现 'gbk' codec can't decode byte 0x89 in position 68: illegal multibyte sequence

    python在读取文件时出现“UnicodeDecodeError:'gbk' codec can't decode byte 0x89 in position 68: illegal multiby ...

  7. Source Insight4

    创建工程: File->open                        打开创建的工程 同步文件: 方便跟踪 Project->Synchronize   Files 打开小窗口 ...

  8. Jedis自己整理比较全的API

    package com.tebon.ams.utils; import com.alibaba.fastjson.JSON;import com.tebon.ams.util.ObjectUtil;i ...

  9. mysql 日志类型

    mysql有四种日志: 所有日志:general log 慢查询日志:slow log 二进制日志:binary log 错误日志:error log windows下在my.ini里配置,linux ...

  10. C#的托管与非托管大难点

    托管代码与非托管代码 众所周知,我们正常编程所用的高级语言,是无法被计算机识别的.需要先将高级语言翻译为机器语言,才能被机器理解和运行.在标准C/C++中,编译过程是这样的:源代码首先经过预处理器,对 ...