Proiezione

Negli esempi in questo argomento viene illustrato come eseguire calcoli specifici su eventi singoli come parte della loro trasformazione in eventi di output. Tali calcoli vengono eseguiti utilizzando la proiezione. Una proiezione funziona su un flusso CepStream<T1> e produce un nuovo flusso CepStream<T2>, dove CepStream<T> è un flusso di eventi con payload di tipo T. Le proiezioni vengono eseguite sempre quando si utilizza la clausola SELECT in LINQ. Esse possono creare in modo implicito un nuovo tipo o fare riferimento in modo esplicito a un tipo di evento definito, come illustrato di seguito.

Esempi

Nell'esempio seguente, ogni evento nel flusso TestEventStream sarà proiettato in un nuovo evento, sulla base delle espressioni del progetto definite nella query. Nella query, i campi i e f vengono moltiplicati per 2. Questi valori vengono proiettati nei nuovi eventi. Il nuovo tipo di evento in questo caso è un tipo anonimo, definito in modo implicito tramite le assegnazioni di campo create dall'espressione del progetto.

// 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};

Nell'esempio seguente ogni evento nel flusso di input di tipo MeterReading viene proiettato in un nuovo evento nel flusso realValueStream, utilizzando il tipo di evento dichiarato in modo esplicito MeterWattage. Il campo consumption per ogni evento nel flusso InputStream viene convertito in un tipo CLR double e viene diviso per 10, quindi viene assegnato al campo wattage di tipo MeterWattage.

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};

Nell'espressione del progetto non è possibile utilizzare il costruttore di un tipo. È sempre necessario specificare l'assegnazione del campo al nuovo tipo (implicito o esplicito) tramite un'espressione MemberInit (l'assegnazione di campi evento viene specificata tra parentesi graffe). Tuttavia, questa sintassi non è richiesta quando si esegue la proiezione di un solo campo di un tipo primitivo, come mostrato nell'esempio seguente:

public class MeterReading
{
    public int consumption;
}

public class MeterWattage
{
    public double wattage;
}

[…]

var realValueStream = from e in InputStream
                      select (double)e.consumption / 10;

Si noti che tramite questa proiezione viene generato in modo implicito un oggetto CepStream di tipo primitivo double.

Quando viene utilizzato un tipo esplicito, è necessario inizializzare ogni campo o proprietà nell'espressione del progetto.

Vedere anche

Concetti

Concetti relativi al server StreamInsight