C# SQLite.net SQLite函数在Linq to SQL中不工作

C# SQLite.net SQLite函数在Linq to SQL中不工作,c#,sqlite,linq-to-sql,system.data.sqlite,C#,Sqlite,Linq To Sql,System.data.sqlite,我使用System.Data.SQLite.SQLiteFunction在C#中创建了一些自定义SQLite函数。当使用SQLiteDataAdapter执行查询时,它工作得很好,它不工作,但是,当使用Linq to SQL时,我会收到错误,指出该函数不存在 我想底线是,如何让自定义SQLite函数在Linq to SQL中工作?要么让它们按照预期的方式加载,要么修改SQLite.Net的源代码,使它们成为dll的一部分 注意:我知道实体框架是首选,这是遗留应用程序,我没有选择更改它。我尝试手动

我使用System.Data.SQLite.SQLiteFunction在C#中创建了一些自定义SQLite函数。当使用SQLiteDataAdapter执行查询时,它工作得很好,它不工作,但是,当使用Linq to SQL时,我会收到错误,指出该函数不存在

我想底线是,如何让自定义SQLite函数在Linq to SQL中工作?要么让它们按照预期的方式加载,要么修改SQLite.Net的源代码,使它们成为dll的一部分

注意:我知道实体框架是首选,这是遗留应用程序,我没有选择更改它。我尝试手动将函数绑定到DataContext。连接,没有骰子


有关试图修改System.Data.SQLite的背景信息: 我尝试下载源代码,我可以成功地从源代码构建,但源代码对我来说有点困惑

  • 在System.Data.SQLite.2012项目中,项目中没有包含任何文件,但所有源文件都存在于实际文件夹中。它们似乎包含在解决方案中名为System.Data.SQLite.Files.targets的文件中。这对我来说是一个奇怪的设置
  • 我将自定义函数添加到项目文件夹中,但没有像所有其他文件一样将它们包含在项目中。然后我将它们添加到System.Data.SQLite.Files.targets
  • 我构建了解决方案,它们确实出现在程序集中。尽管我似乎可以将文件添加到程序集和构建中,但修改现有代码似乎没有任何影响
  • 我进入了SQLiteConnection类,在Open方法中添加了一个throw新异常,我在关键位置添加了Console.Writeline,我在现有代码中修改的任何内容似乎都不会进入已编译的程序集中

这样做的目的是尝试将我的自定义函数构建到System.Data.SQLite.dll中,而不是依赖于通过反射自动加载。

就在那一刻,我发现了这个不错的代码片段

但是没有找到如何使用它。现在有了一个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);
}
现在,在LINQtoSQL中如何实现这一点,我不太清楚,因为我在LINQiQueryProvider上有自己的SQL。这就是如何使用基本的IDbConnection、IDbCommand、IDbDataParameter和IDataReader接口以及自定义的SQLiteFunction实现此功能

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
}