Camlex.Net是一个免费的开源库,它使得开发者能够利用Lambda表达式来构建SharePoint的CAML查询。对于熟悉CAML的开发者来说,他们知道处理字符串形式的CAML查询是多么痛苦的一件事。需要了解许多特定的CAML规则来创建查询,而且当需要在现有查询中添加新的条件时,不得不重建整个XML树。Camlex解决了这些问题,它通过Lambda表达式简化了查询的创建过程。例如:
Camlex.NET for WindowsSharePointServices。直到最近,Camlex只能从表达式中创建CAML,但从3.2版本开始,它也支持扩展字符串查询。在CodeProject上之前的文章中,宣布了Camlex.Net 3.0的发布。从这个版本开始,Camlex可以在两个方向上工作:它可以将Lambda表达式转换成字符串,也可以将字符串转换成Lambda表达式。称这个特性为逆向工程。它可能有很多有趣的应用,其中一个是Camlex Online——一个免费的在线服务,允许开发者将他们的字符串查询重构为Camlex语法。
使用Lambda表达式扩展字符串查询是逆向工程的另一个应用。和其他许多特性一样,这个想法来自于Codeplex上的Camlex社区。那么这到底意味着什么呢?假设有以下字符串查询:
<Where>
<Or>
<Contains>
<FieldRef Name="Title" />
<Value Type="Text">Sharepoint</Value>
</Contains>
<Contains>
<FieldRef Name="Description" />
<Value Type="Text">Sharepoint</Value>
</Contains>
</Or>
</Where>
它返回所有标题或描述字段中包含“SharePoint”这个词的文档。假设决定只从这个查询的结果集中获取已批准的文档。在这个例子中,查询足够简单,可以完全用Camlex重写它:
var query = Camlex.Query().Where(x => (((string)x["Title"]).Contains("Sharepoint") ||
((string)x["Description"]).Contains("Sharepoint")) &&
(string)x["Status"] == SPModerationStatusType.Approved.ToString());
它将生成正在寻找的CAML:
<Where>
<And>
<Or>
<Contains>
<FieldRef Name="Title" />
<Value Type="Text">Sharepoint</Value>
</Contains>
<Contains>
<FieldRef Name="Description" />
<Value Type="Text">Sharepoint</Value>
</Contains>
</Or>
<Eq>
<FieldRef Name="Status" />
<Value Type="Text">Approved</Value>
</Eq>
</And>
</Where>
但在实际应用中,查询可能会更加复杂。另外,它可能来自不想或甚至不能修改的现有组件。那么Camlex在这里如何提供帮助呢?现在可以将现有的字符串查询作为第一个参数传递给Camlex,并将Lambda表达式作为第二个参数。Camlex会处理剩下的工作:
string existingQuery =
"<Where>"
+
"<Or>"
+
"<Contains>"
+
"<FieldRef Name=\"Title\" />"
+
"<Value Type=\"Text\">Sharepoint</Value>"
+
"</Contains>"
+
"<Contains>"
+
"<FieldRef Name=\"Description\" />"
+
"<Value Type=\"Text\">Sharepoint</Value>"
+
"</Contains>"
+
"</Or>"
+
"</Where>";
var query = Camlex.Query().WhereAll(existingQuery, x => (string)x["Status"] ==
SPModerationStatusType.Approved.ToString()).ToString();