2012-06-25 72 views
1

今天我碰到需要編寫使用WHERE [Field] IN [Values]的CAML查詢。我想查詢列表項的標題是由字符串集合包含的列表。在收到運行我的查詢的幾個錯誤之後,我意識到In運算符是SharePoint 2010的新成員,但我仍然在SharePoint 2007中。結果,唯一的選擇是使用多個Or運算符。此外,Or運算符一次只能操作2個值,因此這需要嵌套的Or運算符。你如何構建這樣的查詢?請參閱下面的解決方案CAML「In」運算符等效於SharePoint Services 3(SharePoint 2007)

回答

4

在找到這個解決方案之前,我偶然發現了一些方法。我不確定它的可擴展性,但它適合我的需求,所以我想我會分享它。這種遞歸方法應該返回等效於1到N個字符串標題列表的

WHERE Title IN ([Title1], [Title2],...[TitleN]) 

private string _camlTitleEq = "<Eq>" + 
           "<FieldRef Name=\"Title\" />" + 
           "<Value Type=\"Text\">{0}</Value>" + 
           "</Eq>"; 

private XElement BuildOrClause(List<string> listItemTitles, int index) 
{ 
    //If we've reached the last item in the list, return only an Eq clause 
    if (index == listItemTitles.Count - 1) 
     return XElement.Parse(String.Format(_camlTitleEq, listItemTitles[index])); 
    else 
    { 
     //If there are more items in the list, create a new nested Or, where 
     //the first value is an Eq clause and the second is the result of BuildOrClause 
     XElement orClause = new XElement("Or"); 
     orClause.Add(XElement.Parse(String.Format(_camlTitleEq, listItemTitles[index]))); 
     orClause.Add(BuildOrClause(listItemTitles, index + 1)); 
     return orClause; 
    } 
} 

而且你可以使用它像這樣:

SPQuery query = new SPQuery(); 
string titleIn = BuildOrClause(listItemTitles, 0).ToString(SaveOptions.DisableFormatting); 

query.Query = "<Where>" + 
        titleIn + 
       "</Where>"; 

我希望這可以幫助別人仍然在SP工作2007年建設性的反饋意見是值得歡迎的!如果您在SharePoint 2010中,請使用In Operator中已有的內置程序。

+0

+1不錯的答案。 – pixelbobby

+0

該死的。花了兩個小時寫下我之後錯過了這個。 – David

+0

我應該更新標題還是標籤以便於查找? – xr280xr