2012-05-26 48 views
2

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

+0

你有没有想过在SharePoint列表创建视图然后得到该视图的数据表? –

+0

@EmmieGabrielleLewis:根据我读过的有关创建视图的信息,我可以做的最多的是在“值”字段中进行分组,我仍然需要在数据表中运行一个For循环来获取每个值的最高ID。或者我错过了什么? – sigil

+1

你有没有想过使用LINQ? –

回答

1

它看起来像你在列表上做你自己的版本?如果您只是使用SharePoint版本控制,那么获取最新版本会很容易。 :)

无论如何,CAML是相当有限,并在2007年没有联合(in 2010 you have joins)。除非你在列表上进行某种预处理。我不认为这是可能的。

+0

该列表由一个工作流程填充:每当某个事件发生在另一个列表中的某个项目时,就会将一个新项目添加到该列表中,并在另一个列表中填入带有ID号码的“value”。因为这个事件可能发生在同一个listItem中多次,相同的'value'会出现好几次,我需要记录最近添加的'value'的一个操作。版本控制对此有帮助吗? – sigil

+0

那么你可以在你的“价值列表”上启用版本控制并更新相应的列表项?这样它就是'1:1'而不是'1:*'。它将记录在列表项的版本历史记录中。 –

0

link对我来说是非常有用的:)

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"]) }; 
相关问题