2009-12-11 64 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>");