Получение значений полей элемента списка из списка SP с использованием клиентской объектной модели - PullRequest
7 голосов
/ 16 декабря 2010

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

IЯ хочу удалить отдельный элемент лайнера, используемый для загрузки элемента списка в контексте, и, если возможно, загрузить значения полей элемента в самом первом запросе на выполнение.

Я попытался использовать следующее

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

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

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

Ответы [ 3 ]

5 голосов
/ 15 января 2012

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

Торстен

0 голосов
/ 21 января 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) должен делать то, что вы хотите.

0 голосов
/ 13 января 2011

Я не уверен на 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"));
}

ИЛИ

Свойство, которое вы ищетена самом деле может быть под объектом SPField.Посмотрите здесь на доступные свойства и методы: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfield_members(v=office.12).aspx

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...