我正在使用下面的代碼行來查詢SQLite數據庫中的給定表中的一些數據(平臺是WP81,但我想這在這裏沒關係)。SQLite.net表查詢拋出NullReferenceException
return await Connection.Table<WorkDay>().Where(wd => wd.Date >= @from && wd.Date <= to).ToListAsync().ConfigureAwait(false);
當我執行我的代碼時,我在Where子句中得到一個NullReferenceException異常。當我刪除where條件一切工作正常。
return await Connection.Table<WorkDay>().ToListAsync().ConfigureAwait(false);
爲了確保我的表中的所有條目是有效的,有在日專欄中,我使用的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)}
編輯2的確切堆棧跟蹤:
我打了一下週圍越來越想通了以下內容。
var query = Connection.Table<WorkDay>().Where(wd => wd.Date >= @from && wd.Date <= to);
return query.ToListAsync().ConfigureAwait(false);
當執行該語句,它實際上在ToListAsync()方法,而不是Where方法打破。但是,這也沒有幫助。
後來我嘗試了以下實際工作。
var result = await Connection.Table<WorkDay>().ToListAsync().ConfigureAwait(false);
return result.Where(wd => wd.Date >= @from && wd.Date <= to).ToList();
所以我所做的是將Where方法實際分開。但是,儘管這對我有用,但它並不回答我的問題,因爲我仍然在想爲什麼這樣做不起作用。
你是什麼意思的「NRE在where子句」?如果它實際上是編譯到表達式樹中並進行處理,那麼lambda本身不應拋出異常,只能處理它。在「ToListAsync」被調用之前,你是否真的獲得了一個異常?或者你是否意指「如果我刪除Where,那麼沒有例外」? – 2014-09-30 22:46:33
是否定義了「from」和「to」變量?我也看到'to'這裏沒有'@'。你在'WorkDay'中有'Date'嗎? – MPelletier 2014-09-30 23:01:20
@MPelletier是的。我使用調試器進行了檢查,這兩者都來自並具有價值。 from擁有@因爲它也是C#中的關鍵字,因此通常不允許使用具有該名稱的變量。 – Stephan 2014-10-01 15:02:57