有没有一种“不错的”方式为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);
}
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,则需要分组并加入。