用户定义函数

本主题中的示例演示如何使用对现有 .NET 函数或用户定义函数 (UDF) 的方法调用来扩展 StreamInsight LINQ 运算符中可能的表达式。

通过使用 UDF,可以实现任意复杂程度的表达式。只要是能够使用普通表达式的地方,都可以使用 UDF:筛选器谓词、投影、联合谓词等。不过请注意,对每个事件都会评估这类方法调用。用户定义函数必须编译到程序集中,StreamInsight 服务器可通过在运行时提供和使用适配器的相同方式来访问该程序集。

UDF 的参数和返回值必须是 StreamInsight 基元类型之一。此外,UDF 也接受与区域性相关的参数。

用例

以下用例演示了使用用户定义函数扩展 StreamInsight 查询的功能的方式。

用户定义筛选器

可以创建用户定义筛选器运算符,推断传入的事件并将该事件传递到输出或筛选掉该事件。这种用户定义筛选器可以推断用户定义数据,并且可以在事件筛选进程中包括复杂或专用的逻辑。

用户定义投影

与用户定义筛选器类似,用户定义投影表达式可以生成新的负载值,这是 StreamInsight 中提供的表达式功能无法计算得到的。

示例

下例在筛选器表达式中使用了用户定义计算,这是通过对负载字段应用函数 MyFunc 来实现的。

// Assuming the following input event type: 
public class MyPayload 
{
    public int id;
    public int a; 
    public int b; 
    public double value; 
}

    var filteredStream = from e in stream
                         where e.value > MyFunc(e.a * e.b)
                         select e;

下例在筛选器谓词中指定了用户定义函数 MyFunctions.valThreshold。

var filteredStream = from e in stream
                     where e.value < MyFunctions.valThreshold(e.id)
                     select e;

下例使用用户定义函数 valThreshold,该函数带有一个参数并返回一个值。

    public class MyFunctions
    {
        public static int valThreshold(int id)
        {
            switch (id)
            {
                case 1:
                    return 15;
                case 2:
                    return 11;
                case 3:
                    return 18;
                default:
                    return 0;
            }
        }
    }

在投影中可以像使用任何其他表达式那样使用用户定义投影函数,如下例所示。

var result = from e in stream
             select new { location = MyFunctions.Lookup(e.id) };

除了采用内置基元类型作为参数,用户定义函数还可以采用与区域性相关的信息作为参数。可接受的类型如下:

  • CultureInfo

  • StringComparison

  • CompareOptions

下例显示如何向 UDF 提供特定于区域性的信息。

// Assuming the following input event type: 
public class MyPayload 
{
    public int id;
    public string name; 
}
var result = from e in stream
             select new { location = MyFunctions.Lookup2(
                 e.name,
                 new CultureInfo("en-US"),
                 CompareOptions.IgnoreCase)
             };

还可以使用 Helper 函数 CepUtility.GetEventFieldCulture 从输入流的事件字段中提取区域性信息,如下例所示。

var result = from e in stream
             select new { location = MyFunctions.Lookup2(
                 e.name,
                 CepUtility.GetEventFieldCulture(e.name),
                 CompareOptions.IgnoreCase)
             };

请参阅

概念

使用事件窗口

用户定义聚合和运算符