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 resultSelector
bkz. 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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin