Проекция
В примерах из этого раздела показано, как выполнять определенные вычисления с отдельными событиями в рамках их преобразования в события выхода. Такие вычисления выполняются с помощью проекции. Проекция работает с потоком CepStream<T1> и создает новый поток CepStream<T2>, где CepStream<T> представляет поток событий с полезными данными типа T. Проекции всегда выполняются при использовании предложения select в LINQ. Они могут неявно создавать новый тип или явно ссылаться на определенный тип событий, как показано далее.
Примеры
В следующем примере каждое событие в потоке TestEventStream будет проецироваться в новое событие в соответствии с выражениями проекции, определенным в запросе. Поля i и f в запросе умножаются на 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 будет проецироваться в новое событие в потоке realValueStream с использованием явно объявленного типа событий MeterWattage. Поле consumption для каждого события в потоке InputStream преобразуется в тип CLR double и делится на 10, а затем присваивается полю wattage типа 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};
В выражении проекции нельзя использовать конструктор типа. Всегда необходимо указывать назначение полей для нового (явного или неявного) типа посредством выражения MemberInit (назначение полей события в фигурных скобках). Но этот синтаксис необязателен при получении проекции единственного поля с типом-примитивом, как показано в следующем примере:
public class MeterReading
{
public int consumption;
}
public class MeterWattage
{
public double wattage;
}
[…]
var realValueStream = from e in InputStream
select (double)e.consumption / 10;
Следует учитывать, что эта проекция неявно производит значение CepStream с типом-примитивом double.
Если используется явный тип, то каждое из его полей или свойств необходимо инициализировать в выражении проекции.