SQLite.net表查询抛出NullReferenceException

Ste*_*han 8 c# sqlite async-await sqlite-net

我正在使用以下代码行来查询SQLite数据库中给定表的一些数据(平台是WP81,但我想这并不重要).

return await Connection.Table<WorkDay>().Where(wd => wd.Date >= @from && wd.Date <= to).ToListAsync().ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

当我执行我的代码时,我在Where子句中得到一个NullReferenceException.当我删除where条件时一切正常.

return await Connection.Table<WorkDay>().ToListAsync().ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

为了确保我的表中的所有条目都有效并且Date列中没有空值,我使用SQL工具查看SQLite数据库.

因为我无法调试lambda表达式,所以我有点坚持如何在这里找到问题.我的假设是由于异步处理而出现问题.

编辑: 这是异常的确切堆栈跟踪

{System.NullReferenceException: Object reference not set to an instance of an object.
   at SQLite.Net.TableQuery`1.CompileExpr(Expression expr, List`1 queryArgs)
   at SQLite.Net.TableQuery`1.CompileExpr(Expression expr, List`1 queryArgs)
   at SQLite.Net.TableQuery`1.CompileExpr(Expression expr, List`1 queryArgs)
   at SQLite.Net.TableQuery`1.GenerateCommand(String selectionList)
   at SQLite.Net.TableQuery`1.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at SQLite.Net.Async.AsyncTableQuery`1.<ToListAsync>b__0()
   at System.Threading.Tasks.Task`1.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at TimeStamp.Core.Services.DataService.<GetWorkDays>d__c.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at TimeStamp.Core.ViewModel.MainViewModel.<LoadWorkDays>d__1a.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__3(Object state)}
Run Code Online (Sandbox Code Playgroud)

编辑2:

我玩了一下,发现了以下几点.

var query = Connection.Table<WorkDay>().Where(wd => wd.Date >= @from && wd.Date <= to);
return query.ToListAsync().ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

执行此语句时,它实际上在ToListAsync()方法中而不是Where方法中断.但是,这也无济于事.

后来我尝试了以下实际工作.

var result = await Connection.Table<WorkDay>().ToListAsync().ConfigureAwait(false);
return result.Where(wd => wd.Date >= @from && wd.Date <= to).ToList();
Run Code Online (Sandbox Code Playgroud)

所以我做的是实际分离Where方法.但是虽然这对我有用但它没有回答我的问题,因为我仍然想知道为什么这不起作用.

小智 1

也许我太新了,不知道我在说什么,但我认为你的最后一个例子只需要在通话await之前声明即可ToListAsync

var query = Connection.Table<WorkDay>().Where(wd => wd.Date >= @from && wd.Date <= to);
return await query.ToListAsync().ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

不确定第一个问题的具体情况,但我认为它与Where语句产生的TableAsyncQuery对象有关,在ToListAsync在另一个线程上调用它之前没有完全初始化。