2

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 を使用する必要はありません。

4

2 に答える 2

1

リストで独自のバージョン管理を行っているように見えますか? SharePoint のバージョン管理を使用しただけであれば、最新バージョンを簡単に入手できます。:)

とにかく、CAML はかなり制限されており、2007 年には結合がありません ( 2010 年には結合があります)。リストに対して何らかの前処理を行わない限り..これは不可能だと思います。

于 2012-05-28T01:56:15.207 に答える
0

このリンクは私にとって便利です:)

DataTable dtList = list.Items.GetDataTable();
var grouped = from row in dtList.AsEnumerable()
          group row by row["Value"] into valueGroup
          select new { Value = valueGroup.Key, ID = valueGroup.Max(id => id["ID"]) };
于 2012-08-18T09:30:57.090 に答える