SharePoint Foundation 2010 托管客户端对象模型概述(二) --使用对象标识

对象标识背后的主要概念在于,客户端对象在调用 ExecuteQuery 方法前后会引用 SharePoint Foundation 服务器对象模型中相应的对象。它们会通过多次调用 ExecuteQuery 方法来继续引用该同一对象。

这意味着,在设置查询时,您可以使用客户端对象模型返回的对象来进一步设置查询,然后再调用 ExecuteQuery 方法。这样,您就可以在开始向服务器发送流量以及从服务器接收流量之前,编写更复杂的查询。您可以在单个查询中执行更多有意义的操作,并消除网络流量。

以下示例获取 Announcements 列表对象,然后使用最简单的 CAML 查询检索该列表中的所有项。

C#
using System;
using Microsoft.SharePoint.Client;

class Program
{
    static void Main()
    {
        ClientContext clientContext = new ClientContext("http://intranet.contoso.com");
        List list = clientContext.Web.Lists.GetByTitle("Announcements");
        CamlQuery camlQuery = new CamlQuery();
        camlQuery.ViewXml = "<View/>";
        ListItemCollection listItems = list.GetItems(camlQuery);
        clientContext.Load(list);clientContext.Load(listItems);
        clientContext.ExecuteQuery();
        foreach (ListItem listItem in listItems)
            Console.WriteLine("Id: {0} Title: {1}", listItem.Id, oListItem["Title"]);
    }
}
注意该示例中的顺序:

首先,该代码使用 GetByTitle 方法获取 List 对象。记住,该 List 对象不包含任何数据;在应用程序调用 ExecuteQuery 方法之前,该对象的任何属性中均不会有数据。

然后,该代码对 list 对象调用 GetItems 方法,即使该 list 对象尚未填充数据。

最后,它对 list 对象和 listItems 对象调用 Load 方法,然后再调用 ExecuteQuery 方法。

这里面的关键点在于,客户端对象模型会记往 list 对象就是应用程序使用 GetByTitle 方法初始化的对象,并且客户端对象模型应该在从 SharePoint 数据库检索 list 对象后,对该同一 list 对象执行 CAML 查询。从 ClientObject 类派生的任何类均具有这些语义。

另外,如上所述,在调用 ExecuteQuery 方法后,您可以继续使用客户端对象设置其他查询。在以下示例中,代码将加载 list 对象并调用 ExecuteQuery 方法。然后,它使用该 list 客户端对象调用 List.GetItems 方法,之后再次调用 ExecuteQuery 方法。list 对象通过调用 ExecuteQuery 方法来保留其标识。

C#
using System;
using Microsoft.SharePoint.Client;

class Program
{
    static void Main()
    {
        ClientContext clientContext =
            new ClientContext("http://intranet.contoso.com");
        List list = clientContext.Web.Lists
            .GetByTitle("Announcements");
        clientContext.Load(list);
        clientContext.ExecuteQuery();
        Console.WriteLine("List Title: {0}", list.Title);
        CamlQuery camlQuery = new CamlQuery();
        camlQuery.ViewXml = "<View/>";
        ListItemCollection listItems = list.GetItems(camlQuery);
        clientContext.Load(listItems);
        clientContext.ExecuteQuery();
        foreach (ListItem listItem in listItems)
            Console.WriteLine("Id: {0} Title: {1}",
                oListItem.Id, listItem["Title"]);
    }
}

有些属性和方法会返回不是派生自 ClientObject 类的对象或值类型。仅当方法和属性返回客户端对象或客户端对象集合时,才能从使用客户端对象标识访问这些方法和属性中获益。例如,有些类(如 FieldUrlValue 类和 FieldLookupValue 类)是从 ClientValueObject 类派生的,只有在调用 ExecuteQuery 方法之后,您才能使用返回这些类型的属性。有些属性会返回字符串或整数之类的 .NET Framework 类型,在调用 ExecuteQuery 方法之前,您也不能使用返回这些类型的属性或方法。因为在 ExecuteQuery 调用中填充任意属性的值之前您不能使用这些值,所以也无法查找列表中的项,并使用该项的某个字段值选择其他查询中的项。如果尝试在 ExecuteQuery 方法填充某个属性之前使用该属性,客户端对象模型将引发 PropertyOrFieldNotInitializedException 异常。

警告:
客户端对象标识只对单个 ClientContext 对象有效。如果您将另一个 ClientContext 对象初始化到同一 SharePoint 网站,则无法将来自一个客户端上下文的客户端对象用于另一个客户端上下文。
本文中后面的几个示例都将使用对象标识行为。

注释:
该示例不执行任何错误处理。如果 Announcements 列表不存在,客户端对象模型将在调用 ExecuteQuery 方法时引发异常。如果您编写的代码在所请求的对象不存在时可能会失败,则应准备好捕获异常。
posted @ 2012-02-24 13:57  love007  阅读(379)  评论(0编辑  收藏  举报