Ответ 1
Именно в этот момент я нашел этот хороший фрагмент из этого вопроса
// from /info/37454/createuse-user-defined-functions-in-systemdatasqlite
// taken from http://sqlite.phxsoftware.com/forums/p/348/1457.aspx#1457
[SQLiteFunction(Name = "REGEXP", Arguments = 2, FuncType = FunctionType.Scalar)]
public class RegExSQLiteFunction : SQLiteFunction {
public override object Invoke(object[] args) {
return System.Text.RegularExpressions.Regex.IsMatch(Convert.ToString(args[1]), Convert.ToString(args[0]));
}
}
Но не нашел, как его использовать. Теперь существует метод SQLiteConnection.BindFunction. Это уродливо, поэтому я сделал небольшой метод расширения:
public static void BindFunction(this SQLiteConnection connection, SQLiteFunction function)
{
var attributes = function.GetType().GetCustomAttributes(typeof(SQLiteFunctionAttribute), true).Cast<SQLiteFunctionAttribute>().ToArray();
if (attributes.Length == 0) {
throw new InvalidOperationException("SQLiteFunction doesn't have SQLiteFunctionAttribute");
}
connection.BindFunction(attributes[0], function);
}
И теперь вам просто нужно
using (var connection = new SQLiteConnection( "Data Source=YourDB.sqlite" ))
{
connection.Open(); // Connection must be open to bind a function
connection.BindFunction(new RegExSQLiteFunction());
// Here create a command, and try REGEXP, for example
// SELECT * FROM "table" WHERE "column" REGEXP '(?i)\btest\b'
// looks for the word 'test', case-insensitive in a string column
}
Теперь, как вы можете это сделать в LINQ to SQL, я точно не знаю, потому что у меня есть собственный SQL на LINQ IQueryProvider. Так вы можете сделать это с помощью базовых интерфейсов IDbConnection, IDbCommand, IDbDataParameter и IDataReader и вашей специальной SQLiteFunction.