使用者定義函數

本主題中的範例將示範如何使用現有 .NET 函數或使用者定義函數 (UDF) 的方法呼叫來擴充 StreamInsight LINQ 運算子中可能的運算式。

只要使用 UDF,任何複雜度的運算式都可行。它們可以使用在任何出現一般運算式的位置:篩選述詞、投射、聯結述詞等等。但是請注意,將針對每一個事件來評估這類方法呼叫。使用者定義函數必須編譯成組件,而且此組件可由 StreamInsight 伺服器利用在執行階段中提供和使用配接器的相同方式存取。

UDF 的參數和傳回值必須屬於其中一個 StreamInsight 基本類型。此外,UDF 也會接受與文化特性相關的參數。

使用案例

下列使用案例說明了使用者定義函數可用來擴充 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

下列範例示範如何將文化特性特有的資訊提供給 UDF。

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

文化特性資訊也可以取自輸入資料流中的事件欄位,依照下列範例示範的方式使用 Helper 函數 CepUtility.GetEventFieldCulture。

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

請參閱

概念

使用事件視窗

使用者定義彙總和運算子