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"]) };