Benutzerdefinierte Funktionen

In den Beispielen in diesem Thema wird gezeigt, wie die möglichen Ausdrücke in StreamInsight-LINQ-Operatoren mithilfe von Methodenaufrufen zu vorhandenen .NET-Funktionen oder benutzerdefinierten Funktionen (User-Defined Functions, UDFs) erweitert werden.

Mittels UDFs sind Ausdrücke jeder Komplexität möglich. Sie können immer dann verwendet werden, wenn gewöhnliche Ausdrücke vorhanden sind: Filterprädikate, Projektionen, Join-Prädikate usw. Beachten Sie jedoch, dass ein solcher Methodenaufruf für jedes Ereignis ausgewertet wird. Eine benutzerdefinierte Funktion muss in einer Assembly kompiliert werden, auf die vom StreamInsight-Server auf die gleiche Weise zugegriffen werden kann, wie Adapter zur Laufzeit bereitgestellt und verwendet werden.

Bei den Parametern und dem Rückgabewert einer UDF muss es sich um einen primitiven StreamInsight-Typ handeln. Zudem werden kulturbezogene Parameter für UDFs akzeptiert.

Anwendungsfälle

Die folgenden Anwendungsfälle veranschaulichen Möglichkeiten zum Erweitern der Funktionen von StreamInsight-Abfragen mithilfe von benutzerdefinierten Funktionen.

Benutzerdefinierte Filter

Sie können einen benutzerdefinierten Filteroperator erstellen, der das eingehende Ereignis überprüft und das Ereignis an die Ausgabe übergibt oder das Ereignis herausfiltert. Ein solcher benutzerdefinierter Filter überprüft möglicherweise benutzerdefinierte Daten, und die Ereignisfilterung kann komplexe oder spezielle Logik umfassen.

Benutzerdefinierte Projekte

Ein benutzerdefinierter Projektausdruck kann wie benutzerdefinierte Filter einen neuen Nutzlastwert erzeugen, der mit der in StreamInsight bereitgestellten Ausdrucksfunktionalität nicht berechnet werden kann.

Beispiele

Im folgenden Beispiel wird eine benutzerdefinierte Berechnung in einem Filterausdruck verwendet, indem die Funktion MyFunc auf die Nutzlastfelder angewendet wird.

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

Im folgenden Beispiel wird die benutzerdefinierte Funktion MyFunctions.valThreshold im Filterprädikat angegeben.

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

Im folgenden Beispiel wird die benutzerdefinierte Funktion valThreshold verwendet, die einen einzelnen Parameter akzeptiert und einen Wert zurückgibt.

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

Eine benutzerdefinierte Projektfunktion kann wie ein beliebiger anderer Ausdruck in einer Projektion verwendet werden, wie im folgenden Beispiel gezeigt.

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

Benutzerdefinierte Funktionen können nicht nur integrierte primitive Typen, sondern auch kulturbezogene Informationen als Parameter akzeptieren. Die akzeptierten Typen lauten:

  • CultureInfo

  • StringComparison

  • CompareOptions

Im folgenden Beispiel wird gezeigt, wie kulturspezifische Informationen für eine UDF bereitgestellt werden.

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

Die Kulturinformationen können auch mithilfe der Hilfsfunktion CepUtility.GetEventFieldCulture aus einem Ereignisfeld im Eingabedatenstrom abgerufen werden, wie im folgenden Beispiel gezeigt.

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

Siehe auch

Konzepte

Verwenden von Ereignisfenstern

Benutzerdefinierte Aggregate und Operatoren