2010-12-16 16 views
7

Jaki jest optymalny sposób uzyskania pozycji listy i ich właściwości z listy SP za pomocą modelu obiektu klienta?Uzyskiwanie wartości pól pozycji listy z listy SP za pomocą obiektu klienta Model

Oto kod, którego używam.

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

Chcę usunąć foreach pojedynczy liniowej używany do załadowania elementu listy w kontekście i jeśli to możliwe obciążenie wartości pól punktu pierwszej Execute samo zapytanie.

Próbowałem za pomocą poniższego

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

który nie działa.

Ktoś może zapewnić czystsze rozwiązanie?

Odpowiedz

0

nie jestem 100% pewien, jakie właściwości chcesz dostać z pól, ale można bawić się z następujących czynności:

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

LUB

własnością szukasz może być rzeczywiście pod obiektem SPField. Zapoznaj się z właściwościami i dostępnymi metodami: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfield_members(v=office.12).aspx

Mam nadzieję, że to pomoże. Jeśli nie więcej informacji na temat rzeczywistych właściwości, które chcesz uzyskać z pól list może pomóc zapewnić bardziej dokładne rozwiązanie?

+0

gdy przy użyciu klienta modelu obiektowego strona musimy wyraźnie poprosić o właściwościach jesteśmy W tym konkretnym przypadku potrzebuję F ieldValues ​​kolekcja ListItem, która nie jest wypełniona, chyba że zrobię kontekst. Ładowanie na każdym elemencie listy. –

+0

Twoja odpowiedź dotyczy modelu obiektu serwera, a nie modelu obiektu klienta, o co pyta. – airmanx86

+0

@ airmanx86 - tak, dobry punkt ... przepraszam, zupełnie błędnie przeczytałem ten! – Luke

0

Zmień kod na ten.

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

Następnie zadzwonić LoadQuery() zamiast load()

context.LoadQuery(items); 

Możesz dodać dodatkowe wyrażenia czytać własność ListItem chciałeś tak:

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

jestem faktycznie ma problem z próbą zrobienia item => item.FieldValues, ale działa item => item.FieldValuesAsText. Nie jestem pewien, dlaczego :(Ale po prostu robiąc context.LoadQuery(items) powinien zrobić to, co chcesz.Autor:

5

Najbardziej efektywnym sposobem kwerendy SharePoint jest użycie kwerendy CAML.Zawierając (SP) List.GetItems (camlQuery). zawsze instancją (SP) ListItemCollection.

Więc najskuteczniejszy kwerenda będzie wyglądać następująco

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

Powiązane problemy