12

このようなことを行う 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);
}
4

4 に答える 4

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>");
于 2010-12-19T19:18:05.093 に答える
5

ORいいえ、ネストされたタグを処理する必要があります。これらはCAMLでサポートされているクエリ命令です

たぶんCAML.NETはあなたの探求に役立つでしょう。

于 2009-12-12T00:40:25.213 に答える
5

FullTextSqlQuery

FullTextSqlQueryクラスを使用して、SQL ステートメントを使用して MOSS を検索することができます。このクラスを個人的に使用した経験はありません。これらの記事は役に立つかもしれません:

YACAMLQT

または、T-SQL 構文を使用して SharePoint CAML クエリを作成できるYACAMLQT (Yet Another CAML クエリ ツール)もあります。

SharePoint への LINQ

LINQ に慣れている場合は、LINQ to SharePoint プロジェクトに、LINQ 構文を使用して SharePoint リストをクエリするためのツールが用意されています。このツールはまだアルファ版テスト段階にあるため、本番環境に対応していない可能性があることに注意してください。

U2U CAML クエリ ビルダー

CAML クエリを使用している場合は、 U2U CAML Query Builder for SharePoint (2003 および 2007) ツールを使用して CAML クエリを作成することをお勧めします。このツールを使用すると、以下に示すように、ポイント アンド クリック インターフェイスを使用して、クエリ文字列を作成し、ターゲット リストに対して実行できます。

SharePoint 用の U2U CAML クエリ ビルダーの動作
(出典: u2u.net )

上記の 4 つの方法のうち、U2U CAML Query Builder をお勧めします。過去 6 か月間ほぼ毎日使用しています。また、SharePoint コミュニティで最も広く使用されている CAML ツールでもあるようです。

CAML クエリをコードで作成している場合は、 「動的で再利用可能な CAML クエリ コンポーネントを作成するための .NET 言語ベースのツール セット」を提供するCodePlexのCAML.NET プロジェクトを参照することをお勧めします。 .

于 2009-12-12T00:22:04.907 に答える