SQL IN эквивалент в CAML
Есть ли "отлично" способ создать запрос CAML для SharePoint, который делает что-то вроде этого?
SELECT *
FROM table
WHERE Id IN (3, 12, ...)
Или я застрял с кошмаром вложенных узлы?
РЕДАКТИРОВАТЬ: Это было мое решение для создания узлы.
/// Simulates a SQL 'Where In' clause in CAML
///
/// Specifies the data type for the value contained by the field.
/// Nested 'Or' elements portion of CAML query
public static string CamlIn(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("{0}", CamlIn("SomeColumn", "Number", ids));
Выход:
5
4
2
1
Также немного упростила эту перегрузку для работы с полями поиска.
///
/// Simulates a SQL 'Where In' clause in CAML
///
/// Specify whether to use the Lookup column's Id or Value.
/// Nested 'Or' elements portion of CAML query
public static string CamlIn(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);
}