我想查詢通過Web服務被稱爲valueList
一個SharePoint 2007的列表,並找到最近的各列表項的版本,所以給這個列表:如何查詢Sharepoint列表中每個值的最大ID?
ID | Value
----------
1 | 101
2 | 305
3 | 102
4 | 101
5 | 305
6 | 101
我希望我的查詢返回:
ID | Value
----------
3 | 102
5 | 305
6 | 101
在訪問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 /共享點做到這一點的唯一方法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]);
}
}
的是因爲該字段被存儲爲數據表,例如串1234被存儲爲「1234.0000」。
這似乎不必要的複雜;有沒有更直接的方式來完成我所追求的?如果有更簡單的方法,我不需要使用DataTable或CAML。
你有沒有想過在SharePoint列表創建視圖然後得到該視圖的數據表? –
@EmmieGabrielleLewis:根據我讀過的有關創建視圖的信息,我可以做的最多的是在「值」字段中進行分組,我仍然需要在數據表中運行一個For循環來獲取每個值的最高ID。或者我錯過了什麼? – sigil
你有沒有想過使用LINQ? –