使用客户端对象模型从SP列表中获取列表项字段值

时间:2010-12-16 13:51:32

标签: sharepoint c#-4.0 caml

使用客户端对象模型从SP列表中获取列表项及其属性的最佳方法是什么?

这是我正在使用的代码。

        string server = "http://localhost";
        ClientContext context = new ClientContext(server);
        Web web = context.Web;
        var spList = web.Lists.GetByTitle("Contact");
        CamlQuery query = new CamlQuery();
        var items = spList.GetItems(query);
        context.Load(items, 
            itema => itema.Include(
                item => item,
                item => item["CustomerId"]));
        context.ExecuteQuery();

        Console.WriteLine("Items");
        foreach (var item in items.ToList())
        {                              
               context.Load(item);
        }

        context.ExecuteQuery();
        foreach (var item in items)
        {
             foreach (var a in item.FieldValues)
             {
                 Console.WriteLine(a.Key + ":" + a.Value.ToString());
             }
         }

我想删除用于在上下文中加载列表项的单个内联foreach,如果可能,在第一个执行查询本身中加载项字段值。

我尝试使用以下

 context.Load(items, 
            itema => itema.Include(
                item => item,
                item=> item.FieldValues,
                item => item["CustomerId"]));

哪个不起作用。

任何人都可以提供更清洁的解决方案吗?

4 个答案:

答案 0 :(得分:5)

查询SharePoint的最有效方法是使用CAML查询。通过调用(SP)List.GetItems(camlQuery)。您将始终收到(SP)ListItemCollection的实例。

因此最有效的查询将如下所示

string server = "http://localhost";
var ctx = new ClientContext(server);
var web = ctx.Web;
var list = web.Lists.GetByTitle("Contacts");
var listItemCollection = list.GetItems(CamlQuery.CreateAllItemsQuery());

// always use QueryTrimming to minimize size of 
// data that has to be transfered

ctx.Load(listItemCollection,
           eachItem => eachItem.Include(
            item => item,
            item => item["CustomerId"]));
// ExecuteQuery will pull all data from SharePoint
// which has been staged to Load()
ctx.ExecuteQuery();

foreach(ListItem listItem in listItemCollection)
{
   Console.WriteLine(listItem["CustomerId"]);
}

和Thorsten

答案 1 :(得分:0)

我不是100%确定您希望从字段中获得哪些属性,但您可以使用以下内容:

SPSite oSite = new SPSite("http://localhost");
SPWeb oWeb = oSite.OpenWeb();

SPList oList = oWeb.Lists["LIST NAME"];
SPFieldCollection oFields = oList.Fields;

foreach (SPField oField in oFields)
{
    Console.WriteLine("Property: " + oField.GetProperty("PROPERTY"));
}

OR

您要查找的属性实际上可能位于SPField对象下。请查看可用的属性和方法:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfield_members(v=office.12).aspx

希望这会有所帮助。如果没有更多关于您希望从列表字段中获取哪些实际属性的信息可能有助于提供更准确的解决方案?

答案 2 :(得分:0)

将您的代码更改为此。

IQueryable<ListItem> items = spList.GetItems(query);

然后调用LoadQuery()而不是Load()

context.LoadQuery(items);

您可以添加其他表达式来阅读您想要的ListItem的属性:

context.LoadQuery(items.Include(item => item["CustomerId"]));

我实际上在尝试item => item.FieldValues时遇到问题,但item => item.FieldValuesAsText有效。我不确定为什么:(但只是做context.LoadQuery(items)应该做你想做的事。

答案 3 :(得分:0)

CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml = "<View Scope=\"RecursiveAll\"><Query><Where><Eq><FieldRef Name=\"FSObjType\" /><Value Type=\"Integer\">0</Value></Eq></Where></Query><RowLimit>100</RowLimit></View>";
ListItemCollection listItemCollection = srcList.GetItems(camlQuery);
srcContext.Load(listItemCollection);
await srcContext.ExecuteQueryAsync();

查询 FSObjType=0 返回填充了所有字段的项目!看: https://blog.velingeorgiev.com/sharepoint-online-csom-all-list-items-content-caml-query

该查询以 100 个为一组获取所有列表项。您是否可以在查询中添加一个 AND 子句以获取特定项。