1

今日、WHERE [Field]IN[Values]を使用するCAMLクエリを作成する必要があることに気付きました。リストアイテムのタイトルが文字列のコレクションに含まれているリストをクエリしたかったのです。クエリの実行中にいくつかのエラーを受け取った後、In演算子はSharePoint 2010の新機能ですが、SharePoint 2007を使用していることに気付きました。その結果、複数のOr演算子を使用するしかありません。さらに、Or演算子は、一度に2つの値しか操作できないため、ネストされたOr演算子が必要です。どうすればそのようなクエリを作成できますか?以下の私の解決策を参照してください。

4

1 に答える 1

4

この解決策にたどり着く前に、私はいくつかのアプローチに出くわしました。スケーラビリティはわかりませんが、自分のニーズに合っているので、シェアしたいと思いました。この再帰メソッドは、同等のものを返す必要があります

WHERE Title IN ([Title1], [Title2],...[TitleN]) 

1-N文字列タイトルのリスト。

private string _camlTitleEq = "<Eq>" +
                                 "<FieldRef Name=\"Title\" />" +
                                 "<Value Type=\"Text\">{0}</Value>" +
                              "</Eq>";

private XElement BuildOrClause(List<string> listItemTitles, int index)
{
    //If we've reached the last item in the list, return only an Eq clause
    if (index == listItemTitles.Count - 1)
        return XElement.Parse(String.Format(_camlTitleEq, listItemTitles[index]));
    else
    {
        //If there are more items in the list, create a new nested Or, where
        //the first value is an Eq clause and the second is the result of BuildOrClause
        XElement orClause = new XElement("Or");
        orClause.Add(XElement.Parse(String.Format(_camlTitleEq, listItemTitles[index])));
        orClause.Add(BuildOrClause(listItemTitles, index + 1));
        return orClause;
    }
}

そして、あなたはそれをそのように使うことができます:

SPQuery query = new SPQuery();
string titleIn = BuildOrClause(listItemTitles, 0).ToString(SaveOptions.DisableFormatting);

query.Query = "<Where>" +
                  titleIn +
              "</Where>";

これがSP2007でまだ働いている人に役立つことを願っています。建設的なフィードバックを歓迎します!SharePoint 2010を使用している場合は、既に組み込まれているInOperatorを使用してください

于 2012-06-25T22:15:49.947 に答える