代码之家  ›  专栏  ›  技术社区  ›  Chris

caml中的等效sql

  •  11
  • Chris  · 技术社区  · 15 年前

    有没有一种“好”的方式来创建这样一个针对SharePoint的CAML查询?

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

    或者我陷入了一个嵌套的噩梦 <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);
    }
    
    3 回复  |  直到 11 年前
        1
  •  5
  •   Rubens Farias    15 年前

    不,你需要处理嵌套 OR 这些标签是 supported query instructions on CAML

    也许吧 CAML.NET 可以帮助你完成任务。

        2
  •  23
  •   ScottE    14 年前

    对于使用SharePoint 2010的用户,有一个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>");
    
        3
  •  5
  •   Tangiest    15 年前

    全文SQL查询

    可以使用SQL语句搜索moss,使用 FullTextSqlQuery 班级。我没有亲自使用这门课的经验。这些物品可用于:

    雅卡姆兰特

    或者,还有 YACAMLQT (Yet Another CAML Query Tool) 它允许您使用T-SQL语法创建SharePoint CAML查询。

    Linq到SharePoint

    如果你能跟上Linq的速度,那么 LINQ to SharePoint project 提供使用LINQ语法查询SharePoint列表的工具。请注意,此工具仍处于alpha测试阶段,因此可能尚未准备好生产。

    u2u凸轮查询生成器

    如果您使用的是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查询,那么我建议您查看 CAML.NET project CodePlex ,其中规定“ 一组基于.NET语言的工具,用于创建动态、可重用的CAML查询组件 “。