投影

 

本主题中的示例说明如何对各个事件执行特定的计算,以作为将它们转换为输出事件的一部分。 此类计算通过使用“投影”来执行。 投影针对 IQStreamable<T1> 临时流运行,并生成一个新的 IQStreamable<T2> 流,其中 IQStreamable<T> 是负载类型为 T 的事件流。 在 LINQ 中使用 select 子句时,总是会发生投影。 可以隐式创建一个新类型,或者显式引用已定义的事件类型,如下所示。

System_CAPS_ICON_note.jpg 注意


投影也可以针对 CEPStream<T> 流执行操作,该流由输入适配器和输出适配器生成和使用。 有关开发输入适配器和输出适配器的详细信息,请参阅输入和输出适配器(旧模型)。 本主题中的讨论适用于这两种类型的流。

示例

在以下示例中,TestEventStream 流中的每个事件都将根据在查询中定义的投影表达式投影到一个新事件。 在查询中,字段 if 被乘以 2。 这些值将投影到新事件中。 此处的新事件类型为匿名类型,它通过投影表达式所创建的字段赋值隐式定义。

// Assuming the following input event type:  
public class MyPayload  
{  
    public int i;  
    public float f;  
}  
  
var queryProject = from c in TestEventStream  
                   select new {i = c.i * 2, f = c.f * 2};  

在以下示例中,类型为 MeterReading 的输入流中的每个事件都将使用显式声明的事件类型 MeterWattage 投影到 realValueStream 流中的一个新事件。 InputStream 流中每个事件的 consumption 字段都将转换为 double CLR 类型并除以 10,然后分配给类型为 MeterWattagewattage 字段。

public class MeterReading  
{  
    public int consumption;  
}  
  
public class MeterWattage  
{  
    public double wattage;  
}  
  
[…]  
  
var realValueStream = from e in InputStream  
                      select new MeterWattage {wattage = (double)e.consumption / 10};  

投影表达式不能使用类型的构造函数。 它必须始终通过 MemberInit 表达式(花括号内的事件字段赋值)指定新类型的字段赋值(隐式或显式)。 但是,在投影基元类型的单个字段时,此语法不是必需的,如下面的示例所示:

public class MeterReading  
{  
    public int consumption;  
}  
  
public class MeterWattage  
{  
    public double wattage;  
}  
  
[…]  
  
var realValueStream = from e in InputStream  
                      select (double)e.consumption / 10;  

请注意:此投影将隐式生成基元类型为 double 的流。

如果使用显式类型,则必须在投影表达式中初始化其各个字段或属性。

请参阅

StreamInsight 服务器概念