当前位置: 首页 > 面试题库 >

CAML中的SQL IN等效项

郝君博
2023-03-14
问题内容

有没有一种“不错的”方式为SharePoint创建CAML查询,而这种方式呢?

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);
}

问题答案:

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

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



 类似资料:
  • Bolt 是 Objective Caml 编程语言的日志记录框架。

  • 问题内容: Printf在1.5版本中添加到Java中,但是我似乎找不到如何将输出发送到字符串而不是文件的方法(这是sprintf在C语言中的作用)。有谁知道如何做到这一点? 问题答案: 查看格式及其语法

  • 问题内容: 有谁知道我如何在.NET中实现Java的Deflater.deflate()功能,因此对于Java的Infalter.inflate()方法是可以理解的? 问候,拉法尔 问题答案: 我已经使用#zipLib。这很简单。 从他们的网站上获取: / zip压缩,而且我不想使用libzip.dll或类似的东西。我希望全部使用纯C# 。”

  • 问题内容: Java中是否有等效的C#DataTable? 问题答案: 一个类似的问题最近已要求。ResultSet当然不是直接等效的,因为它仅适用于与数据库的活动连接,而DataTable可以“脱机”使用。 从个人经验来看,我会说Java中没有直接等效的功能(尽管还没有尝试过)。您要么使用普通的SQL,要么是您的朋友。或者您使用一些ORM工具,例如Hibernate,Cayenne,Toplin

  • 问题内容: 除了使用计时器来计数随时间变化的元素数量并寻找更改之外,我没有想到更好的方法来模拟此事件。 是否有某种DOMNodeInserted的专有IE版本?谢谢。 问题答案: 不,没有。最接近的事件是响应元素的属性或CSS属性的更改而触发的事件。响应于直接更改元素的属性而触发,但不通过其他方式(例如,通过使用DOM方法(例如,通过更改子元素的)来更改元素的内容)时触发。

  • 问题内容: 说我有下表称为: 我的目标是最终得出一个不同的列表,并以逗号分隔: 这可以在MySQL中轻松完成,但是与Django等效项却遇到了麻烦。到目前为止,这是我所缺少的,但是我缺少这些东西: 如果可能,我想避免使用原始SQL查询。 任何帮助将不胜感激! 问题答案: Django ORM不支持此功能。如果你不想使用原始SQL,则需要分组并加入。