Proyección
En los ejemplos de este tema se muestra cómo realizar cálculos concretos sobre eventos individuales como parte de su transformación en eventos de salida. Este tipo de cálculo se realiza mediante la proyección. Una proyección funciona en un flujo CepStream<T1> y produce un nuevo flujo CepStream<T2> donde CepStream<T> es un flujo de eventos con carga de tipo T. Las proyecciones siempre tienen lugar cuando se usa la cláusula SELECT en LINQ. Pueden crear un nuevo tipo implícitamente o hacer referencia explícitamente a un tipo de evento definido, como se muestra a continuación.
Ejemplos
En el siguiente ejemplo, cada evento de la secuencia TestEventStream se proyectará en un nuevo evento, según las expresiones de proyección definidas en la consulta. En la consulta, los campos i y f se multiplican por 2. Estos valores se proyectan en los nuevos eventos. Este nuevo tipo de evento es un tipo anónimo, que se define implícitamente a través de las asignaciones de campo creadas por la expresión de proyección.
// 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};
En el siguiente ejemplo, cada evento del flujo de entrada de tipo MeterReading se proyectará en un nuevo evento del flujo realValueStream, mediante el tipo de evento declarado explícitamente MeterWattage. El campo consumption de cada evento del flujo InputStream se convierte en un tipo CLR double, se divide por 10 y, a continuación, se asigna al campo wattage de 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};
La expresión de proyecto no puede utilizar el constructor de un tipo. Siempre debe especificar la asignación de campo al nuevo tipo (implícito o explícito) a través de una expresión MemberInit (la asignación de campos de evento entre llaves). No obstante, esta sintaxis no es obligatoria al proyectar un campo individual de un tipo primitivo, tal como se muestra en el siguiente ejemplo:
public class MeterReading
{
public int consumption;
}
public class MeterWattage
{
public double wattage;
}
[…]
var realValueStream = from e in InputStream
select (double)e.consumption / 10;
Tenga en cuenta que esta proyección produce implícitamente un CepStream de tipo primitivo double.
Cuando se usa un tipo explícito, cada uno de sus campos o propiedades se debe inicializar en la expresión de proyección.