在2011年11月,发布了开源库Camlex.Net的下一个主要版本3.0。同时,还推出了基于Camlex.Net 3.0的在线版本:。在本文中,将描述新版本的新特性和架构。
原始的“旧”Camlex允许开发者创建CAML查询而无需直接处理实际的CAML。例如,如果需要获取所有标题等于"Hello world!"的项目,可以使用以下代码:
C# string caml = Camlex.Query()
.Where(x => (string)x["Title"] == "Hello world!").ToString();
这将产生以下字符串:
XML
此外,可以使用&&(AND)和||(OR)操作符来动态构建复杂的CAML查询。如果想了解更多关于Camlex以前版本的其他特性,可以查看CodeProject上的以下文章:
从3.0版本开始,它还支持相反的转换:现在可以将CAML查询作为字符串传递,它将生成可以在项目中代替硬编码字符串的C#代码。这简化了现有应用程序向Camlex.Net的重构。
但这还不是全部。一个不错的功能是,如果需要将CAML转换为C#,不必下载Camlex程序集并创建一个应用程序。还推出了在线版本:,可以在其中输入CAML查询并将其转换为C#。如果尝试转换上面显示的CAML,它将产生以下代码(在在线版本中,需要一个额外的Query标签作为所有查询的父标签):
C# Camlex.Query().Where(x => (string)x["Title"] == "Hello world!")
如所见,它产生了与之前编写的相同的代码,但现在Camlex为完成了!称这个功能为反向工程,因为所有在Camlex.Net中实现的CAML操作(除了那些在Sharepoint 2010中引入的CAML元素,例如In和Includes)都被反转到相反的方向:从CAML到C#。
从技术上讲,实现了第二个Camlex的反向方向。以下图片显示了“基本”Camlex的架构:
输入是C# lambda表达式,输出是CAML查询。为了将lambda转换为CAML,实现了翻译器和分析器。对于反向工程,输入是CAML,输出是C#。因此实现了另一个翻译器、分析器以及链接器,将查询的不同部分链接在一起(CAML查询不限于Query元素,还包括ViewFields、OrderBy、GroupBy)。因此,反向工程的架构如下:
(Re前缀表示反向工程)。正如提到的,技术上实现了第二个Camlex。单元测试的数量是一个很好的指标:它增加了大约2倍(目前大约有500个测试)。
如图片所示,输出是一个表达式树。将表达式树转换为字符串是可能的,但它不会是可编译的C#代码。为了在在线版本中打印C#代码,使用了一个很棒的开源项目:ExpressionToCode。它也有一个翻译器,可以将表达式树转换为C#代码:
在结合这些技术之后(Expression2Code中的一些问题为此进行了修复。其中大部分问题在ExpressionToCode网站的issue部分进行了报告。只有几个Camlex特定的变通方法没有发布),推出了在线转换器。
反向工程版本将使开发更加快速。可以使用U2U CAML构建器工具创建CAML查询,并使用在线服务将其转换为Camlex。因此,将同时拥有这两个工具的优势:交互式CAML查询创建和编译时检查。
正如上面提到的,反转了Camlex当前支持的所有操作。例如,如果输入包含OrderBy的CAML:
XML
它将被转换为以下C#代码,包括流畅的接口调用:
C# Camlex.Query().Where(x => (string)x["Title"] == "Hello world!")
.OrderBy(x => new[] { x["Modified"], x["Modified By"] })