2010-12-16 2 views
7

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

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

Я попытался с помощью следующей

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

, который не работает.

Любой может предоставить более чистое решение?

ответ

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")); 
} 

ИЛИ

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

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

+0

при использовании клиентской стороне объектной модели мы должны явно указать свойства нас В этом конкретном случае мне нужен F Коллекция ieldValues ​​ListItem, которая не заполняется, если я не делаю context.Load на каждый элемент списка. – 2011-01-14 00:09:29

0

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

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

Затем вызовите LoadQuery() вместо Load()

context.LoadQuery(items); 

Вы можете добавить дополнительные выражения для чтения свойство из ListItem вы хотите, как это:

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

Я действительно having проблема пытаясь сделать item => item.FieldValues, но item => item.FieldValuesAsText работ. Я не уверен, почему :(Но просто делать context.LoadQuery(items) должен делать то, что вы хотите.

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"]); 
} 

Торстен

Смежные вопросы