Kullanıcı tanımlı işlevler

Çoğu veritabanı, kendi işlevlerinizi tanımlamak için kullanabileceğiniz bir yordamsal SQL diyalektine sahiptir. Ancak SQLite, uygulamanızla birlikte işlem halinde çalışır. SQL'in yeni bir diyalektini öğrenmek yerine uygulamanızın programlama dilini kullanabilirsiniz.

Skaler işlevler

Skaler işlevler, sorgudaki her satır için tek bir skaler değer döndürür. Yeni skaler işlevleri tanımlayın ve kullanarak CreateFunctionyerleşik işlevleri geçersiz kılın.

Bkz . Desteklenen parametre listesi için veri türleri ve bağımsız değişken için func dönüş türleri.

bağımsız değişkeninin state belirtilmesi, işlevin her çağrısına bu değeri geçirir. Kapatmaları önlemek için bunu kullanın.

SQLite'in sorguları derlerken ek iyileştirmeler kullanmasına izin vermek için işlevinizin belirleyici olup olmadığını belirtin isDeterministic .

Aşağıdaki örnekte, silindir yarıçapını hesaplamak için skaler işlevin nasıl ekleneceği gösterilmektedir.

connection.CreateFunction(
    "volume",
    (double radius, double height)
        => Math.PI * Math.Pow(radius, 2) * height);

var command = connection.CreateCommand();
command.CommandText =
@"
    SELECT name,
           volume(radius, height) AS volume
    FROM cylinder
    ORDER BY volume DESC
";

İşleçler

Aşağıdaki SQLite işleçleri ilgili skaler işlevler tarafından uygulanır. Uygulamanızda bu skaler işlevlerin tanımlanması, bu işleçlerin davranışını geçersiz kılar.

Operatör İşlev
X GLOB Y glob(Y, X)
X LIKE Y like(Y, X)
X LIKE Y ESCAPE Z like(Y, X, Z)
X MATCH Y match(Y, X)
X REGEXP Y regexp(Y, X)

Aşağıdaki örnekte, karşılık gelen işlecini etkinleştirmek için regexp işlevinin nasıl tanımlanacağı gösterilmektedir. SQLite, regexp işlevinin varsayılan uygulamasını içermez.

connection.CreateFunction(
    "regexp",
    (string pattern, string input)
        => Regex.IsMatch(input, pattern));

var command = connection.CreateCommand();
command.CommandText =
@"
    SELECT count()
    FROM user
    WHERE bio REGEXP '\w\. {2,}\w'
";
var count = command.ExecuteScalar();

Toplama işlevleri

Toplama işlevleri, sorgudaki tüm satırlar için tek bir toplanmış değer döndürür. kullanarak CreateAggregatetoplama işlevlerini tanımlama ve geçersiz kılma.

seed bağımsız değişkeni bağlamın ilk durumunu belirtir. Kapatmaları önlemek için de bunu kullanın.

Bağımsız func değişken satır başına bir kez çağrılır. Nihai sonucu birikmesi için bağlamı kullanın. Bağlamı döndür. Bu desen, bağlamın bir değer türü veya sabit olmasını sağlar.

Belirtilmezse resultSelector , sonuç olarak bağlamın son durumu kullanılır. Bu, yalnızca her satırda bir sayıyı artırması ve döndürmesi gereken toplam ve sayı gibi işlevlerin tanımını basitleştirebilir.

Tüm satırları yineledikten sonra bağlamdan nihai sonucu hesaplamak için belirtin resultSelector .

bağımsız değişkeni için desteklenen parametre türlerinin listesi ve func için dönüş türleri için resultSelectorbkz. Veri türleri.

İşleviniz belirleyiciyse, sorgu derlerken SQLite'in ek iyileştirmeler kullanmasına izin vermek için belirtin isDeterministic .

Aşağıdaki örnek, bir sütunun standart sapması hesaplamak için bir toplama işlevi tanımlar.

connection.CreateAggregate(
    "stdev",

    // A tuple to maintain context between rows
    (Count: 0, Sum: 0.0, SumOfSquares: 0.0),

    // This is called for each row
    ((int Count, double Sum, double SumOfSquares) context, double value) =>
    {
        context.Count++;
        context.Sum += value;
        context.SumOfSquares += value * value;

        return context;
    },

    // This is called to get the final result
    context =>
    {
        var variance = context.SumOfSquares - context.Sum * context.Sum / context.Count;

        return Math.Sqrt(variance / context.Count);
    });

var command = connection.CreateCommand();
command.CommandText =
@"
    SELECT stdev(gpa)
    FROM student
";
var stdDev = command.ExecuteScalar();

Hatalar

Kullanıcı tanımlı bir işlev özel durum oluşturursa, ileti SQLite'e döndürülür. Ardından SQLite bir hata oluşturur ve Microsoft.Data.Sqlite bir SqliteException oluşturur. Daha fazla bilgi için bkz . Veritabanı hataları.

Varsayılan olarak SQLite hata kodu SQLITE_ERROR (veya 1) olur. Bununla birlikte, işlevinizde istenen SqliteErrorCode şekilde bir SqliteException oluşturarak bunu değiştirebilirsiniz.

Hata ayıklama

SQLite uygulamanızı doğrudan çağırır. Bu, SQLite sorguları değerlendirirken tetikleyen kesme noktaları eklemenize olanak tanır. Kullanıcı tanımlı işlevlerinizi oluşturmanıza yardımcı olmak için tam .NET hata ayıklama deneyimi sağlanır.

Ayrıca bkz.