[SQLiteFunction(Name = "REGEXP", Arguments = 2, FuncType = FunctionType.Scalar)] public class RegExSQLiteFunction : SQLiteFunction { public static SQLiteFunctionAttribute GetAttribute() { return (SQLiteFunctionAttribute)typeof(RegExSQLiteFunction).GetCustomAttributes(typeof(SQLiteFunctionAttribute), false).Single(); } public override object Invoke(object[] args) { try { // , return Regex.IsMatch((string)args[1], (string)args[0]); } catch (Exception ex) { // System.Data.SQLite, return ex; } } }
var connection = new SQLiteConnection(connectionString); connection.Open(); connection.BindFunction(RegExSQLiteFunction.GetAttribute(), new RegExSQLiteFunction());
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // Code First // modelBuilder.Conventions.Add(new RegexpFunctionConvention()); }
public class RegexpFunctionConvention : IStoreModelConvention<EdmModel> { public void Apply(EdmModel item, DbModel model) { // var patternParameter = FunctionParameter.Create("pattern", this.GetStorePrimitiveType(model, PrimitiveTypeKind.String), ParameterMode.In); var inputParameter = FunctionParameter.Create("input", this.GetStorePrimitiveType(model, PrimitiveTypeKind.String), ParameterMode.In); // var returnValue = FunctionParameter.Create("result", this.GetStorePrimitiveType(model, PrimitiveTypeKind.Boolean), ParameterMode.ReturnValue); var function = this.CreateAndAddFunction(item, "regexp", new[] { patternParameter, inputParameter }, new[] { returnValue }); } private EdmFunction CreateAndAddFunction(EdmModel item, string name, IList<FunctionParameter> parameters, IList<FunctionParameter> returnValues) { EdmFunctionPayload payload = new EdmFunctionPayload { StoreFunctionName = name, Parameters = parameters, ReturnParameters = returnValues, Schema = this.GetDefaultSchema(item), IsBuiltIn = true // , }; EdmFunction function = EdmFunction.Create(name, this.GetDefaultNamespace(item), item.DataSpace, payload, null); item.AddItem(function); return function; } // }
internal static class R { [DbFunction("CodeFirstDatabaseSchema", "regexp")] public static bool Regexp(string pattern, string input) { // throw new NotImplementedException(); } }
// entities Item, Name pattern using (MyDataContext context = new MyDataContext(myConnection)) { var filteredItems = context.Items.Where(i => R.Regexp(pattern, i.Name)); }
Source: https://habr.com/ru/post/272917/
All Articles