使用 Camlex.Net 通过 lambda 表达式扩展字符串 CAML 查询





0/5 (0投票)
展示了开发人员如何使用逆向工程功能,通过 lambda 表达式向字符串 CAML 查询添加新的条件。
使用 Camlex.Net 通过 lambda 表达式扩展字符串 CAML 查询
Camlex.Net 是一个免费的开源库,允许使用 lambda 表达式为 SharePoint 构建 CAML 查询。每个使用过 CAML 的开发人员都知道,使用字符串 CAML 查询是多么痛苦。您需要了解许多特定的 CAML 规则来创建查询,并且当您需要向现有查询添加新条件时,您必须重建整个 xml 树。Camlex 解决了这些问题,并简化了使用 lambda 表达式创建查询的过程。您可以在这里看到一些例子:用于 Windows SharePoint 服务的 Camlex.NET。直到最近,Camlex 只能从表达式创建 CAML,但从 3.2 版本开始,它也支持扩展字符串查询。
在 CodeProject 上的前一篇文章中(参见Camlex.NET 3.0 和 Camlex Online:CAML 逆向工程),我宣布发布 Camlex.Net 3.0。从此版本开始,Camlex 在两个方向上都有效:它可以将 lambda 表达式转换为字符串,也可以将字符串转换为 lambda 表达式。我们称这个功能为逆向工程。它可能具有 Camlex 的许多有趣的应用。其中之一是 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>
它返回 Title 或 Description 字段中包含 "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();
结果,您将获得与上面相同的 CAML 查询。Camlex 需要知道应该使用什么逻辑运算来连接字符串部分和 lambda 表达式部分:And 或 Or。当从 IQuery
接口中选择方法时指定:WhereAll
或 WhereAny
。类似于 LINQ 方法:在 WhereAll
中使用 And
运算,而在 WhereAny Or
中使用。
使用这种技术,您还可以扩展查询中现有的 OrderBy
、GroupBy
和 ViewFields
部分。此外,您可以传递表达式的 IEnumerable
来扩展字符串查询,这允许您动态地构建它们。更多示例可以在这里找到。