Projektion
Die Beispiele in diesem Thema zeigen, wie bestimmte Berechnungen über einzelne Ereignisse als Teil ihrer Transformation in Ausgabeereignisse ausgeführt werden. Solche Berechnungen werden mittels Projektion ausgeführt. Eine Projektion operiert auf einem CepStream<T1>-Datenstrom und ergibt einen neuen CepStream<T2>-Datenstrom, wobei CepStream<T> der Datenstrom des Ereignisses mit der Nutzlast vom Typ "T" ist. Projektionen treten immer beim Verwenden der select-Klausel in LINQ auf. Sie können implizit einen neuen Typ erstellen oder explizit auf einen definierten Ereignistyp verweisen, wie unten gezeigt.
Beispiele
Im folgenden Beispiel wird jedes Ereignis im Datenstrom TestEventStream in ein neues Ereignis entsprechend den in der Abfrage definierten Projektausdrücken projiziert. In der Abfrage werden die Felder i und f mit 2 multipliziert. Diese Werte werden in die neuen Ereignisse projiziert. Der neue Ereignistyp ist hierbei ein anonymer Typ und wird implizit durch die vom Projektausdruck erstellten Feldzuweisungen definiert.
// 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};
Im folgenden Beispiel wird jedes Ereignis im Eingabedatenstrom vom Typ MeterReading in ein neues Ereignis im Datenstrom realValueStream projiziert, und es wird der explizit deklarierte Ereignistyp MeterWattage verwendet. Das Feld consumption für jedes Ereignis im Datenstrom InputStream wird in den CLR-Typ double konvertiert, durch 10 geteilt und dann dem Feld wattage vom Typ MeterWattage zugewiesen.
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};
Der Projektausdruck kann den Konstruktor eines Typs nicht verwenden. Die Feldzuweisung auf den neuen (impliziten oder expliziten) Typ muss immer durch einen MemberInit-Ausdruck erfolgen (Zuweisung von Ereignisfeldern in geschweiften Klammern). Diese Syntax ist jedoch nicht erforderlich, wenn ein einzelnes Feld mit primitivem Typ projiziert wird, wie im folgenden Beispiel gezeigt:
public class MeterReading
{
public int consumption;
}
public class MeterWattage
{
public double wattage;
}
[…]
var realValueStream = from e in InputStream
select (double)e.consumption / 10;
Beachten Sie, dass diese Projektion implizit einen CepStream mit primitivem Double-Typ erzeugt.
Wenn ein expliziter Typ verwendet wird, muss jedes der Felder oder Eigenschaften im Projektausdruck initialisiert werden.