Funzioni definite dall'utente

Negli esempi in questo argomento viene illustrato come estendere le espressioni possibili negli operatori LINQ di StreamInsight utilizzando chiamate ai metodi per le funzioni .NET esistenti o le funzioni definite dall'utente (UDF).

Tramite le UDF, si possono utilizzare espressioni di qualsiasi complessità. Queste funzioni possono essere utilizzate in qualsiasi punto in cui sono presenti espressioni comuni, come predicati di filtro, proiezioni, predicati di join e così via. Tenere tuttavia presente una chiamata al metodo di questo tipo viene valutata per ogni evento. Una funzione definita dall'utente deve essere compilata in un assembly accessibile dal server StreamInsight nello stesso modo in cui gli adattatori vengono forniti e utilizzati in fase di esecuzione.

I parametri e il valore restituito di una funzione definita dall'utente devono essere costituiti da uno dei tipi primitivi di StreamInsight. Le funzioni definite dall'utente accettano inoltre i parametri correlati alle impostazioni cultura.

Modalità di utilizzo comuni

Di seguito vengono definiti i modi in cui le funzioni definite dall'utente possono essere utilizzate per estendere le funzionalità delle query di StreamInsight.

Filtri definiti dall'utente

È possibile creare un operatore di filtro definito dall'utente che consenta di valutare l'evento in ingresso e passare l'evento all'output o escluderlo. Un filtro definito dall'utente di questo tipo consente di valutare i dati definiti dall'utente e includere logica complessa o specializzata nel processo di filtro degli eventi.

Progetti definiti dall'utente

Analogamente ai filtri definiti dall'utente, un'espressione di progetto definita dall'utente può produrre un nuovo valore di payload, il cui calcolo va oltre le capacità della funzionalità relativa alle espressioni di StreamInsight.

Esempi

Nell'esempio seguente viene utilizzato un calcolo definito dall'utente in un'espressione di filtro applicando la funzione MyFunc nei campi payload.

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

Nell'esempio seguente viene specificata la funzione definita dall'utente MyFunctions.valThreshold nel predicato di filtro.

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

Nell'esempio seguente viene utilizzata la funzione definita dall'utente valThreshold, che include un singolo parametro e restituisce un valore.

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

Una funzione di progetto definita dall'utente può essere utilizzata come qualsiasi altra espressione in una proiezione, come illustrato nell'esempio seguente.

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

Oltre ad accettare tipi primitivi incorporati come parametri, le funzioni definite dall'utente possono accettare come parametri informazioni correlate alle impostazioni cultura. I tipi accettati sono i seguenti:

  • CultureInfo

  • StringComparison

  • CompareOptions

Nell'esempio seguente viene illustrato come fornire informazioni specifiche delle impostazioni cultura a una funzione definita dall'utente.

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

Le informazioni sulle impostazioni cultura possono anche essere derivate da un campo evento nel flusso di input, utilizzando la funzione di supporto CepUtility.GetEventFieldCulture come illustrato nell'esempio seguente.

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

Vedere anche

Concetti

Utilizzo delle finestre di eventi

Funzioni di aggregazione e operatori definiti dall'utente