投射

 

本主題的範例示範如何在將個別事件轉換成輸出事件的過程中,執行個別事件的特定計算。 這類運算是使用*「投射」*(Projection) 來執行。 投射會針對 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,然後指派給 MeterWattage 類型的 wattage 欄位。

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 伺服器概念