我想查询通过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? –