2009-12-11 68 views
11

是否有一種「很好」的方式來創建一個類似於SharePoint的CAM的CAML查詢?在CAML中相當於SQL IN

SELECT * 
FROM table 
WHERE Id IN (3, 12, ...) 

還是我堅持嵌套<Or>節點的夢魘?


編輯:這是我的解決方案,生成<Or>節點。

/// Simulates a SQL 'Where In' clause in CAML 
/// </summary> 
/// <param name="columnType">Specifies the data type for the value contained by the field.</param> 
/// <returns>Nested 'Or' elements portion of CAML query</returns> 
public static string CamlIn<T>(string internalFieldName, string columnType, T[] values) 
{ 
    XDocument doc = new XDocument(); 
    XElement prev = null; 
    int index = 0; 

    while (index < values.Length) 
    { 
     XElement element = 
      new XElement("Or", 
       new XElement("Eq", 
        new XElement("FieldRef", 
        new XAttribute("Name", internalFieldName)), 
       new XElement("Value", 
        new XAttribute("Type", columnType), 
        values[index++].ToString()))); 

     if (index == values.Length - 1) 
     { 
      element.AddFirst(
       new XElement("Eq", 
        new XElement("FieldRef", 
        new XAttribute("Name", internalFieldName)), 
       new XElement("Value", 
        new XAttribute("Type", columnType), 
        values[index++].ToString()))); 
     } 

     if (prev != null) 
      prev.AddFirst(element); 
     else 
      doc.Add(element); 

     prev = element; 
    } 

    return doc.ToString(SaveOptions.DisableFormatting); 
} 

用法:

int[] ids = new int[] { 1, 2, 4, 5 }; 
string query = string.Format("<Where>{0}</Where>", CamlIn("SomeColumn", "Number", ids)); 

輸出:

<Where> 
    <Or> 
     <Or> 
      <Or> 
       <Eq> 
        <FieldRef Name=\"SomeColumn\" /> 
        <Value Type=\"Number\">5</Value> 
       </Eq> 
       <Eq> 
        <FieldRef Name=\"SomeColumn\" /> 
        <Value Type=\"Number\">4</Value> 
       </Eq> 
      </Or> 
      <Eq> 
       <FieldRef Name=\"SomeColumn\" /> 
       <Value Type=\"Number\">2</Value> 
      </Eq> 
     </Or> 
     <Eq> 
      <FieldRef Name=\"SomeColumn\" /> 
      <Value Type=\"Number\">1</Value> 
     </Eq> 
    </Or> 
</Where> 

也讓這款超載與查找字段的工作更容易一點

/// <summary> 
/// Simulates a SQL 'Where In' clause in CAML 
/// </summary> 
/// <param name="lookupId">Specify whether to use the Lookup column's Id or Value.</param> 
/// <returns>Nested 'Or' elements portion of CAML query</returns> 
public static string CamlIn<T>(string internalFieldName, bool lookupId, T[] values) 
{ 
    XDocument doc = new XDocument(); 
    XElement prev = null; 
    int index = 0; 

    while (index < values.Length) 
    { 
     XElement element = 
      new XElement("Or", 
       new XElement("Eq", 
        new XElement("FieldRef", 
         new XAttribute("Name", internalFieldName), 
         lookupId ? new XAttribute("LookupId", "TRUE") : null), 
        new XElement("Value", 
         new XAttribute("Type", "Lookup"), 
         values[index++].ToString()))); 

     if (index == values.Length - 1) 
     { 
      element.AddFirst(
       new XElement("Eq", 
        new XElement("FieldRef", 
         new XAttribute("Name", internalFieldName), 
         lookupId ? new XAttribute("LookupId", "TRUE") : null), 
        new XElement("Value", 
         new XAttribute("Type", "Lookup"), 
         values[index++].ToString()))); 
     } 

     if (prev != null) 
      prev.AddFirst(element); 
     else 
      doc.Add(element); 

     prev = element; 
    } 

    if (values.Length == 1) 
    { 
     XElement newRoot = doc.Descendants("Eq").Single(); 
     doc.RemoveNodes(); 
     doc.Add(newRoot); 
    } 

    return doc.ToString(SaveOptions.DisableFormatting); 
} 

回答

5

FullTextSqlQuery

可以使用SQL語句搜索MOSS,使用FullTextSqlQuery類。我沒有親自使用這門課的經驗。這些文章可能是有用的:

YACAMLQT

另外,還有YACAMLQT (Yet Another CAML Query Tool)它允許你使用T-SQL創建SharePoint CAML查詢句法。

LINQ到SharePoint

如果您了LINQ速度,那麼LINQ to SharePoint project提供查詢使用LINQ語法SharePoint列表的工具。請注意,該工具仍處於alpha測試階段,因此可能無法進行生產準備。

U2U CAML查詢生成器

如果您正在使用CAML查詢工作,我會建議使用U2U CAML Query Builder for SharePoint(2003和2007)工具來建立你的CAML查詢。該工具允許您構建查詢字符串,並使用點擊式界面在目標列表中執行它,如下所示。

U2U CAML Query Builder for SharePoint in action http://www.u2u.net/res/Images/Tools/CQB/buildwhereclause6.png

以上四種方法,我可以推薦U2U CAML查詢生成器,已經幾乎每天都用它在過去的6個月。它也似乎是SharePoint社區中使用最廣泛的CAML工具。

請注意,如果您在代碼中構建CAML查詢,那麼我建議您查看上CodePlex,它提供了「」的一組。。用於創建動態的,可重複使用的CAML查詢組件」 NET基於語言的工具

+0

不知道關於CAML.NET。將來可能需要使用它。我做了一些與XElements類似的事情來生成必要的''。 – Chris 2009-12-12 22:37:45

23

對於使用2010的Sharepoint那些有可用的IN元素:

http://msdn.microsoft.com/en-us/library/ff625761.aspx

這裏的一個工作示例:

SPQuery locationsQuery = new SPQuery(); 
locationsQuery.Query = string.Concat("<Where>", 
             "<In>", 
             "<FieldRef Name='ID' />", 
              "<Values>", 
              "<Value Type='Number'>6</Value>", 
              "<Value Type='Number'>7</Value>", 
              "<Value Type='Number'>8</Value>", 
              "</Values>", 
             "</In>", 
            "</Where>");