SQL IN中的SQL IN等价物

Chr*_*ris 12 sql sharepoint-2007 caml where-in

是否有一种"好的"方法来为SharePoint创建这样的类似的CAML查询?

SELECT *
FROM table
WHERE Id IN (3, 12, ...)
Run Code Online (Sandbox Code Playgroud)

还是我陷入了嵌套<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);
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

输出:

<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>
Run Code Online (Sandbox Code Playgroud)

这也使得使用查找字段更容易

/// <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);
}
Run Code Online (Sandbox Code Playgroud)

Sco*_*ttE 23

对于使用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>");
Run Code Online (Sandbox Code Playgroud)


Mag*_*ndi 5

FullTextSqlQuery

可以使用FullTextSqlQuery类使用SQL语句搜索MOSS .我没有亲自使用这门课程的经验.这些文章可能有用:

YACAMLQT

或者,还有YACAMLQT(又一个CAML查询工具),它允许您使用T-SQL语法创建SharePoint CAML查询.

LINQ to SharePoint

如果您熟悉LINQ,那么LINQ to SharePoint项目提供了一个使用LINQ语法查询SharePoint列表的工具.请注意,此工具仍处于alpha测试阶段,因此可能无法生产.

U2U CAML查询生成器

如果您正在使用CAML查询,我建议使用U2U CAML Query Builder for SharePoint(2003和2007)工具来构建您的CAML查询.该工具允许您使用点击式界面构建查询字符串并对目标列表执行它,如下所示.

适用于SharePoint的U2U CAML查询生成器http://www.u2u.net/res/Images/Tools/CQB/buildwhereclause6.png

在上述四种方法中,我可以推荐U2U CAML查询生成器,在过去的6个月中几乎每天都使用它.它似乎也是SharePoint社区中使用最广泛的CAML工具.

请注意,如果你正在建设中的代码CAML查询,那么我建议你看一看的CAML.NET项目CodePlex上,它提供了" 一组基于.NET语言的工具,用于创建动态的,可重复使用的CAML查询组件 " .


Rub*_*ias 5

不,你需要处理嵌套OR标签; 这些是CAML支持的查询说明

也许CAML.NET可以帮助您完成任务.