2010-12-16 4 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()); 
      } 
     } 

私は、最初のクエリ自体の実行中項目のフィールド値コンテキスト内で、可能な負荷ならば、リストの項目をロードするために使用される単一のライナーのforeachを削除したいです。

私は、次の

動作しません
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")); 
} 

OR

SPFieldオブジェクトの下にあります。利用可能なプロパティとメソッドについては、ここをクリックしてください。http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfield_members(v=office.12).aspx

リストのフィールドから実際のプロパティを取得したい場合は、より正確なソリューションを提供するのに役立つかもしれない情報についての情報はありませんか?

+0

使用してクライアント側オブジェクトモデルのようになります。この特定の場合、私はF各リスト項目のcontext.Loadを行わない限り、読み込まれていないListItemのieldValuesコレクションです。 –

+0

あなたの答えは、サーバーオブジェクトモデルではなく、クライアントオブジェクトモデルです。これは、質問が尋ねていることです。 – airmanx86

+0

@ airmanx86 - はい、良い点...申し訳ありません、私はこのことを完全に誤解しました! – Luke

0

コードをこれに変更します。

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

そして、(代わりに負荷LoadQuery()を呼び出す)

context.LoadQuery(items); 

あなたはListItemあなたはこのように望んでいたのプロパティ読み取るために、追加の表現を追加する可能性があります。私は

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

を実際にはitem => item.FieldValuesをしようとすると問題がありますが、item => item.FieldValuesAsTextが動作します。私はなぜ:(しかし、ちょうどcontext.LoadQuery(items)することはあなたが欲しいものを行う必要があります。

5

SharePointを照会する最も効率的な方法は、(SP)List.GetItems(camlQuery)を呼び出すことによってCAMLクエリを使用することです。 (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"]); 
} 

トルステン

関連する問題