Web サービス経由で呼び出された SharePoint 2007 リストにクエリを実行し、valueList
各リスト項目の最新バージョンを見つけたいので、次のリストを指定します。
ID | Value
----------
1 | 101
2 | 305
3 | 102
4 | 101
5 | 305
6 | 101
クエリを返したい:
ID | Value
----------
3 | 102
5 | 305
6 | 101
Access SQL では、次のようにします。
select v1.* from valueList v1
inner join
(select value, max(id) as maxID from valueList group by value) v2
on v1.id=v2.maxID
これまでのところ、C#/CAML/Sharepoint Web サービスでこれを行う唯一の方法は、CAML クエリを実行してリスト項目をグループvalue
化して並べ替えID
、クエリを DataTable にダンプし、すべての行を調べることです。 DataTable で、各 の最後の行を選択しますvalue
。次のようにコードします。
//dataHandler constructor initializes Web Services Lists() object
dataHandler dh = new dataHandler();
string[] fields = { "ID", "value"};
string query =
"<GroupBy collapse='true'>" +
"<FieldRef Name='value' />" +
"</GroupBy>" +
"<OrderBy>" +
"<FieldRef Name='ID' />" +
"</OrderBy>";
DataTable listTable = dh.listToDataTable("valueList", fields, query);
//copy listTable structure to blank resultTable
DataTable resultTable = listTable.Clone();
//initialize value
int value = (int)Convert.ToDouble(listTable.Rows[0][1]);
for (int ctr = 0; ctr < listTable.Rows.Count; ctr++)
{
//check to see if we've gone onto a new 'value', if so get previous row
if (value != (int)Convert.ToDouble(listTable.Rows[ctr][1]) )
{
resultTable.ImportRow(listTable.Rows[ctr - 1]);
value = (int)Convert.ToDouble(listTable.Rows[ctr][1]);
}
//get the last row
if (ctr == listTable.Rows.Count - 1)
{
resultTable.ImportRow(listTable.Rows[ctr]);
}
}
これ(int)Convert.ToDouble
は、フィールドが文字列として DataTable に格納されるためです。たとえば、1234 は「1234.0000」として格納されます。
これは不必要に複雑に思えます。私が求めていることを達成するためのより直接的な方法はありますか? もっと簡単な方法があれば、DataTables や CAML を使用する必要はありません。