Получение значений поля элемента списка из списка SP с использованием клиентской объектной модели

Каков оптимальный способ получить элементы списка и их свойства из списка 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"]));

что не работает.

Кто-нибудь может предоставить более чистое решение?


person Sandeep Singh Rawat    schedule 16.12.2010    source источник


Ответы (4)


Самый эффективный способ запроса 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"]);
}

Торстен

person Thorsten Hans    schedule 15.01.2012

Я не уверен на 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

Надеюсь это поможет. Если бы не дополнительная информация о том, какие фактические свойства вы хотите получить из полей списков, может помочь найти более точное решение?

person Luke    schedule 13.01.2011
comment
при использовании объектной модели на стороне клиента нам нужно явно запрашивать свойства, которые мы ищем. В этом конкретном случае мне нужна коллекция FieldValues ​​для ListItem, которая не заполняется, если я не делаю context.Load для каждого отдельного элемента списка. - person Sandeep Singh Rawat; 14.01.2011
comment
ваш ответ касается объектной модели сервера, а не объектной модели клиента, о чем и спрашивается вопрос. - person airmanx86; 21.01.2011
comment
@ airmanx86 - да, хорошая мысль ... извините, я совершенно неправильно это понял! - person Luke; 22.01.2011

Измените свой код на этот.

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) должно делать то, что вы хотите.

person airmanx86    schedule 21.01.2011

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 в запрос, чтобы получить определенные элементы.

person AlyaKoni    schedule 26.01.2021