Поделиться через


Проекция

В примерах из этого раздела показано, как выполнять определенные вычисления с отдельными событиями в рамках их преобразования в события выхода. Такие вычисления выполняются с помощью проекции. Проекция работает с потоком 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.

Если используется явный тип, то каждое из его полей или свойств необходимо инициализировать в выражении проекции.

См. также

Основные понятия

Основные понятия сервера служб StreamInsight