65.9K
CodeProject 正在变化。 阅读更多。
Home

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

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2012年12月4日

Ms-PL

3分钟阅读

viewsIcon

21923

downloadIcon

204

展示了开发人员如何使用逆向工程功能,通过 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 接口中选择方法时指定:WhereAllWhereAny。类似于 LINQ 方法:在 WhereAll 中使用 And 运算,而在 WhereAny Or 中使用。

使用这种技术,您还可以扩展查询中现有的 OrderByGroupByViewFields 部分。此外,您可以传递表达式的 IEnumerable 来扩展字符串查询,这允许您动态地构建它们。更多示例可以在这里找到。

您可以从 CodeProject 下载源代码二进制文件,或者从CodePlex下载。

© . All rights reserved.