web-dev-qa-db-ja.com

クライアントオブジェクトモデルを使用して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"]));

これは機能しません。

誰でもよりクリーンなソリューションを提供できますか?

7

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

トルステン

5
Thorsten Hans

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

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

次に、Load()の代わりにLoadQuery()を呼び出します

_context.LoadQuery(items);
_

次のように、必要なListItemのプロパティを読み取るための式を追加できます。

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

実際に_item => item.FieldValues_を実行しようとして問題が発生していますが、_item => item.FieldValuesAsText_は機能します。理由はわかりません:(しかし、context.LoadQuery(items)を実行するだけで、必要なことが実行されます。

0
airmanx86

フィールドからどのプロパティを取得したいかは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
Luke