Projection

Les exemples de cette rubrique indiquent comment effectuer des calculs spécifiques sur des événements individuels dans le cadre de leur transformation en événements de sortie. Ces calculs sont effectués à l'aide d'une projection. Une projection opère sur un flux de données CepStream<T1> et cède un nouveau flux de données CepStream<T2> où CepStream<T> est le flux de données de l'événement qui a une charge utile de type T. Les projections ont toujours lieu lors de l'utilisation de la clause « select » dans LINQ. Elles peuvent créer un nouveau type implicitement ou faire explicitement référence à un type d'événement défini, tel qu'indiqué ci-dessous.

Exemples

Dans l'exemple suivant, chaque événement du flux de données TestEventStream est projeté dans un nouvel événement, d'après les expressions de projection définies dans la requête. Dans la requête, les champs i et f sont multipliés par 2. Ces valeurs sont projetées dans les nouveaux événements. Le nouveau type d'événement est ici défini implicitement comme un type anonyme via les affectations de champ créées par l'expression de projection.

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

Dans l'exemple suivant, chaque événement du flux de données d'entrée de type MeterReading est projeté dans un nouvel événement du flux de données realValueStream, à l'aide du type d'événement MeterWattage déclaré explicitement. Le champ consumption pour chaque événement dans le flux de données InputStream est converti en un type CLR double et est divisé par 10, puis affecté au champ wattage du type 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};

L'expression de projection ne peut pas utiliser le constructeur d'un type. Elle doit toujours spécifier l'affectation du champ au nouveau type (implicite ou explicite) via une expression MemberInit (affectation du champ d'événement entre accolades). Toutefois, il n'est pas nécessaire d'utiliser cette syntaxe lorsqu'un seul champ de type primitif est projeté, comme l'illustre l'exemple suivant :

public class MeterReading
{
    public int consumption;
}

public class MeterWattage
{
    public double wattage;
}

[…]

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

Notez que cette projection produit implicitement un CepStream de type primitif double.

Lorsqu'un type explicite est utilisé, chacun de ses champs ou propriétés doit être initialisé dans l'expression de projection.

Voir aussi

Concepts

Concepts du serveur StreamInsight