2014-09-30 86 views
7

我正在使用下面的代碼行來查詢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方法實際分開。但是,儘管這對我有用,但它並不回答我的問題,因爲我仍然在想爲什麼這樣做不起作用。

+0

你是什麼意思的「NRE在where子句」?如果它實際上是編譯到表達式樹中並進行處理,那麼lambda本身不應拋出異常,只能處理它。在「ToListAsync」被調用之前,你是否真的獲得了一個異常?或者你是否意指「如果我刪除Where,那麼沒有例外」? – 2014-09-30 22:46:33

+0

是否定義了「from」和「to」變量?我也看到'to'這裏沒有'@'。你在'WorkDay'中有'Date'嗎? – MPelletier 2014-09-30 23:01:20

+0

@MPelletier是的。我使用調試器進行了檢查,這兩者都來自並具有價值。 from擁有@因爲它也是C#中的關鍵字,因此通常不允許使用具有該名稱的變量。 – Stephan 2014-10-01 15:02:57

回答

1

也許我太新了,不知道我在說什麼,但我認爲你的最後一個例子只需要你的ToListAsync調用之前的await聲明。

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

對第一個問題的具體情況不知道,但我認爲它有事情做與TableAsyncQuery對象,即Where語句產生的,沒有被完全初始化的ToListAsync調用它在另一個線程之前。

+0

不幸的是,我現在不能再測試了,因爲我現在正在使用另一個數據庫而不是SQLite(iBoxDB)。但我敢肯定,Visual Studio會抱怨,如果我嘗試訪問任務結果與異步那裏。但我可能錯了。 – Stephan 2015-01-05 22:59:50

相關問題