Camlex.NET 3.0 和 Camlex Online:CAML 逆向工程





5.00/5 (1投票)
Camlex.NET 3.0 和 Camlex Online 允许开发者将 CAML 查询重构为可编译的 C# 代码
Camlex.NET 3.0:逆向工程和在线版本
在 2011 年 11 月,我们发布了开源库 Camlex.Net 3.0 的下一个主要版本。 我们还推出了基于 Camlex.Net 3.0 的在线版本:http://camlex-online.org。 在本文中,我将介绍新版本的新功能和架构。
最初的“旧” Camlex 允许开发者创建 CAML 查询,而无需处理实际的 CAML,即,如果您需要获取所有 Title 等于 "Hello world!
" 的项目,我们可以使用以下代码来实现
string caml = Camlex.Query()
.Where(x => (string)x["Title"] == "Hello world!").ToString();
它将生成以下 string
<Where>
<Eq>
<FieldRef Name="Title" />
<Value Type="Text">Hello world!</Value>
</Eq>
</Where>
此外,您可以使用 && (AND) 和 || (OR) 运算组合表达式来动态构建复杂的 CAML 查询。
如果您想了解有关先前版本的 Camlex 的其他功能的更多信息,可以查看 CodeProject 上的以下文章
从 3.0 版本开始,它还支持相反的转换:现在您可以将 CAML 查询作为字符串传递,它将生成 C# 代码,该代码可以代替项目中的硬编码字符串使用。 这样可以简化将现有应用程序重构为 Camlex.Net 的过程。
但这还不是全部。 好的地方在于,如果您需要将 CAML 转换为 C#,则无需下载 Camlex 程序集并使用它创建应用程序。 我们还推出了在线版本 http://camlex-online.org,您可以在其中放置 CAML 查询并将其转换为 C#。 如果您尝试转换上面显示的 CAML,它将生成以下代码(在在线版本中,所有查询都需要额外的 Query
标记作为父标记)
Camlex.Query().Where(x => (string)x["Title"] == "Hello world!")
如您所见,它生成了与我们上面编写的代码相同的代码,但现在 Camlex 为我们完成了它! 我们将此功能称为逆向工程,因为 Camlex.Net 中实现的所有 CAML 操作(Sharepoint 2010 中引入的那些除外,例如 In 和 Includes)都已反转到相反的方向:从 CAML 到 C#。
从技术上讲,我们以相反的方向实现了第 2 个 Camlex。下图显示了“基本” Camlex 的架构

输入是 C# lambda 表达式,输出是 CAML 查询。 为了将 lambda 转换为 CAML,我们实现了转换器和分析器。 对于逆向工程,输入是 CAML,输出是 C#。 因此,我们实现了另一个转换器和分析器,以及一个链接器,用于将查询的不同部分链接在一起(CAML 查询不仅限于 Query 元素,还包括 ViewFields、OrderBy、GroupBy)。 因此,逆向工程架构如下所示

(Re 前缀表示逆向工程)。 正如我提到的,从技术上讲,我们实现了第 2 个 Camlex。 单元测试的数量是一个很好的指标:它增加了约 2 倍(目前约为 500 个测试)。
如图所示,输出中有一个表达式树。 可以将表达式树转换为字符串,但它不会是可编译的 C# 代码。 为了在在线版本中打印 C# 代码,我们使用了一个很棒的开源项目:ExpressionToCode。 它还有一个转换器,可以将表达式树转换为 C# 代码

在结合这些技术之后(修复了 Expression2Code 中的几个问题。 大多数问题都已在 ExpressionToCode 网站的问题部分中报告。 只有几个 Camlex 特定的解决方法未发布),我们推出了在线转换器。
逆向工程版本将使开发更加快捷。 您可以使用 U2U CAML Builder 工具创建 CAML 查询,并使用在线服务将其转换为 Camlex。 因此,您将拥有这两种工具的优势:交互式 CAML 查询创建和编译时检查。
正如我上面提到的,我们反转了当前 Camlex 中支持的所有操作。 例如,如果您输入包含 OrderBy
的 CAML
<Where>
<Eq>
<FieldRef Name="Title" />
<Value Type="Text">Hello world!</Value>
</Eq>
</Where>
<OrderBy>
<FieldRef Name="Modified" />
<FieldRef Name="Modified By" />
</OrderBy>
它将被转换为以下 C# 代码,包括 Fluent 接口调用
Camlex.Query().Where(x => (string)x["Title"] == "Hello world!")
.OrderBy(x => new[] { x["Modified"], x["Modified By"] })
将来,添加到 Camlex 的每个新功能也将以 2 个方向添加:C# 到 CAML 和 CAML 到表达式树,即,我们将保持 Camlex 可逆。
您可以直接从 CodeProject 下载 源代码 和 二进制文件,或从 CodePlex 下载。 我们将感谢您对 Camlex 的反馈,您可以在 此处 发布。