使用 Microsoft Rules Composer 向规则添加算术和逻辑运算符

适用于:Azure 逻辑应用(标准)

本指南演示如何使用 Microsoft Rules Composer 将算术和逻辑运算符添加到规则集中的规则。

先决条件

向规则添加算术运算符

可以将算术运算符添加到规则中的条件或操作。 下表对可用的算术运算符进行了说明:

算数运算符 说明
添加 将 arg1 添加到 arg2 的加法运算符。
减 减法运算符用于从arg2中减去arg1。
相乘 用于将arg1乘以arg2的乘法运算符。
划分 将arg1除以arg2的除法运算符。
余数 执行余数运算符,将 arg1 对 arg2 进行取模操作。
  1. 在“Microsoft Rules Composer”中,加载包含要处理的规则存储的 XML 文件。

  2. 在“规则集资源管理器”窗口中,找到并选择所需的规则。

  3. 在“事实浏览器”窗口中,选择“词汇”选项卡。

  4. 在“词汇”“函数”>“版本 1.0”下,将所需的算术运算符拖动到条件编辑器的条件参数或操作编辑器的操作参数中>。

  5. 在条件或操作参数中,指定左操作数和右操作数的值。

    • 如果操作数的类型不同,规则引擎会执行自动数字提升,将较小的操作数类型转换为较大的操作数类型。

      例如,假设你对一个具有 int 类型的操作数和一个具有 long 类型的操作数使用 Add 运算符。 在引擎执行 Add 运算前,引擎会将 int 类型转换为 long 类型。

    • 如果引擎可以将两个操作数都提升为共同类型,则引擎支持双重提升。

      例如,假设使用 Add 运算符对一个具有 int 类型的操作数和一个具有 uint 类型的操作数进行运算。 在引擎执行 Add 运算前,会将两个操作数类型转换为 long 类型。

将逻辑运算符添加到规则

您可以在条件中的谓词上添加逻辑运算符。 下表对可用的逻辑运算符进行了说明:

逻辑运算符 说明
和 合并两个或多个谓词以形成逻辑 AND 表达式。 当两个谓词都评估为 true 时,返回 true。 否则返回 False。
或 合并两个或多个谓词以形成逻辑 OR 表达式。 如果某个谓词判断为 true,则返回 true。 否则返回 False。
不 对逻辑表达式或谓词取反。 当谓词评估结果为false时,返回true。 否则返回 False。
  1. 在“Microsoft Rules Composer”中,加载包含要处理的规则存储的 XML 文件。

  2. 在“规则集资源管理器”窗口中,找到并选择所需的规则。

  3. 在 IF 窗格(即条件编辑器)中,从“条件”快捷菜单中选择以下命令之一:

    逻辑运算符 说明
    添加逻辑 AND 合并两个或多个谓词以形成逻辑 AND 表达式。
    添加逻辑 OR 合并两个或多个谓词以形成逻辑 OR 表达式。
    添加逻辑 NOT 对逻辑表达式或谓词取反。
  4. 在条件编辑器中,打开运算符的快捷菜单,然后添加所需的谓词或嵌套逻辑运算符。

    如果操作数的类型不同,规则引擎会将一个操作数的类型转换为与另一个操作数相匹配的类型,或者在对表达式求值之前将两个操作数的类型转换为共同类型。

处理 NULL 值

下一部分描述了与不同类型相关的 null 值的预期行为,并提供了检查 null 或特定字段或成员是否存在的选项。

.NET 类

  • 对于从 Object 类型派生的类型,可以将字段设置为 null。

  • 对于非值类型的参数,可以将 null 作为参数传递,但根据成员的实现,可能会出现运行时错误。

  • 如果返回类型不是 Object 类型,则不能使用 null 进行比较。

XML 元素

  • XML 文档绝不会将 XML 值返回为 null。 该值要么是空字符串,要么是“不存在”错误。 对于空字符串,某些类型的转换可能会发生错误,例如在建立规则时指定为整数类型的字段。

  • Microsoft Rules Composer 不允许将字段设置为 null 或将字段类型设置为 Object。

  • 通过对象模型,您可以将类型设置为 Object。 在这种情况下,根据 XPath 表达式,返回值具有 XPath 计算结果的类型,如“浮点”、“布尔”或“字符串”。

检查是否为空或是否存在

在编写规则时,自然需要先检查字段是否存在,然后再比较其值。 但是,如果字段为 null 或不存在,比较值会导致错误。

例如,假设你有以下规则:

IF Product/Quantity Exists AND Product/Quantity > 1

如果不存在 Product/Quantity,则规则将引发错误。 要解决这个问题,可以将父节点传递给一个帮助程序方法,如果该元素存在,该方法返回 Product/Quantity 值,如果该元素不存在,则返回其他值。

以下示例显示了更新的和新的帮助程序方法规则:

规则 1

IF Exists(Product/Quantity) THEN Assert(CreateObject(typeof(Helper), Product/Quantity))

规则 2

IF Helper.Value == X THEN...

另一种可行的解决方案是创建如以下示例的规则:

IF Product/Quantity Exists THEN CheckQuantityAndDoSomething(Product/Quantity)

在前面的示例中,<CheckQuantityAndDoSomething> 函数检查参数值,并在满足条件时执行。

若要确定现有参数是否为 null,请使用 Composer:

argument is equal to <null>

注意

或者,也可以修改 XML 事实的 XPath Field 属性,以捕获任何错误,但不建议采用这种方法。