【问题标题】:How do I use Sqlite.Net Extensions Filter如何使用 Sqlite.Net 扩展过滤器
【发布时间】:2017-01-06 22:34:39
【问题描述】:

我正在使用Sqlite.Net Extensions 库从我的数据库中获取对象。

我有一个Id's 列表,我想从我的列表中包含该 ID 的数据库中获取所有对象。

我有以下内容:

var filteredCalls = listOfIds;            
var conn = Databsae.Connection;
var NewCalls = conn.GetAllWithChildren<Call>(x => filteredCalls.Any(y => y == x.Id));

但是这段代码返回错误:

[错误] 致命的未处理异常: System.Reflection.TargetInvocationException:已引发异常 通过调用的目标。 ---> System.NotSupportedException: 无法编译:Lambda 08-30 15:46:57.210 E/mono-rt (16849): at SQLite.Net.TableQuery1[T].CompileExpr (System.Linq.Expressions.Expression expr, System.Collections.Generic.List1 queryArgs) [0x007aa] in :0 08-30 15:46:57.210 E/mono-rt (16849): at SQLite.Net.TableQuery1[T].CompileExpr (System.Linq.Expressions.Expression expr, System.Collections.Generic.List1 queryArgs) [0x001a5] in :0 08-30 15:46:57.210 E/mono-rt (16849): at SQLite.Net.TableQuery1[T].GenerateCommand (System.String selectionList) [0x0006d] in <filename unknown>:0 08-30 15:46:57.210 E/mono-rt (16849): at SQLite.Net.TableQuery1[T].GetEnumerator() [0x00008] 在:0 08-30 15:46:57.210 E/mono-rt (16849):在 System.Collections.Generic.List1[T]..ctor (IEnumerable1 集合)[0x00073] 中 /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/collections/generic/list.cs:98 08-30 15:46:57.210 E/mono-rt (16849): at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) [0x00011] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/System.Core/System/Linq/Enumerable.cs:835 08-30 15:46:57.210 E/mono-rt (16849): at SQLiteNetExtensions.Extensions.ReadOperations.GetAllWithChildren[T] (SQLite.Net.SQLiteConnection conn, System.Linq.Expressions.Expression1 过滤器,布尔递归) [0x00015] 在 /Users/redent/Documents/workspace/sqlite-net-extensions/SQLiteNetExtensions/Extensions/ReadOperations.cs:60

那么我应该如何使用GetAllWithChildren 方法而不使其崩溃?文档很少

额外

这是line where the method is implemented

Sqlite 中可能不支持 lambda 表达式,如 here 所述,如果是这种情况,有什么替代方法/应该如何使用这种方法?

【问题讨论】:

    标签: c# sqlite mono sqlite.net


    【解决方案1】:

    所以看起来Sqlite.Net 无法处理嵌套在另一个 lamdba 表达式中的 Lambda 表达式。因此,我将过滤器更改为:

    var NewCalls = conn.GetAllWithChildren<DiaryCall>(x => filteredCalls.Contains(x.Id));
    

    【讨论】:

    • 似乎发生了这种“SQL 变量太多”,当filteredCalls 列表有超过999 个元素(默认最大参数值)时,see here
    猜你喜欢
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多