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


Определяемые пользователем функции

Примеры в этом разделе демонстрируют, как расширить спектр применимых выражений в операторах LINQ StreamInsight путем применения вызовов методов к существующим функциям .NET или к определяемым пользователям функциям (UDF).

Использование определяемых пользователем функций позволяет создавать выражения любой сложности. Они могут использоваться везде, где встречаются обычные выражения: в предикатах фильтров, проекциях, предикатах соединения и т. д. Однако нужно учитывать, что такой вызов метода выполняется для каждого события. Определяемая пользователем функция должна компилироваться в сборку, к которой сервер StreamInsight может обращаться таким же способом, каким адаптеры предоставляются и используются во время выполнения.

Параметры и возвращаемое значение определяемой пользователем функции должны иметь один из типов-примитивов StreamInsight. Кроме того, определяемые пользователем функции принимают параметры, относящиеся к культуре.

Способы применения

В следующих вариантах применения показаны способы использования определяемых пользователем функций, расширяющих возможности запросов StreamInsight.

Определяемые пользователем фильтры

Можно создать определяемый пользователем оператор фильтра для оценки входящего события и передачи события в выходные данные или фильтрации события. Такой определяемый пользователем фильтр может обрабатывать определяемые пользователем данные и может включать сложную или специализированную логику для процесса фильтрации событий.

Определяемые пользователем проекты

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

Примеры

В следующем примере используется определяемое пользователем вычисление в критерии фильтра — к полям полезных данных применяется функция MyFunc.

// Assuming the following input event type: 
public class MyPayload 
{
    public int id;
    public int a; 
    public int b; 
    public double value; 
}

    var filteredStream = from e in stream
                         where e.value > MyFunc(e.a * e.b)
                         select e;

В следующем примере определяемая пользователем функция MyFunctions.valThreshold указывается в предикате фильтра.

var filteredStream = from e in stream
                     where e.value < MyFunctions.valThreshold(e.id)
                     select e;

В следующем примере используется определяемая пользователем функция valThreshold, которая принимает один параметр и возвращает значение.

    public class MyFunctions
    {
        public static int valThreshold(int id)
        {
            switch (id)
            {
                case 1:
                    return 15;
                case 2:
                    return 11;
                case 3:
                    return 18;
                default:
                    return 0;
            }
        }
    }

Определяемая пользователем функция проекции может использоваться аналогично любому другому выражению в проекции, как показано в следующем примере.

var result = from e in stream
             select new { location = MyFunctions.Lookup(e.id) };

Определяемые пользователем функции могут принимать в качестве параметров встроенные типы-примитивы, а также данные, относящиеся к культуре. Принимаются следующие типы.

  • CultureInfo

  • StringComparison

  • CompareOptions

В следующем примере показано, как передать в определяемую пользователем функцию данные, относящиеся к культуре.

// Assuming the following input event type: 
public class MyPayload 
{
    public int id;
    public string name; 
}
var result = from e in stream
             select new { location = MyFunctions.Lookup2(
                 e.name,
                 new CultureInfo("en-US"),
                 CompareOptions.IgnoreCase)
             };

Сведения о культуре также можно получать из поля события во входном потоке с использованием вспомогательной функции CepUtility.GetEventFieldCulture, как показано в следующем примере.

var result = from e in stream
             select new { location = MyFunctions.Lookup2(
                 e.name,
                 CepUtility.GetEventFieldCulture(e.name),
                 CompareOptions.IgnoreCase)
             };

См. также

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

Использование окон событий

Определяемые пользователем статистические функции и операторы