2014-04-30 21 views
3

我在使用LINQ訪問SQLite數據庫時遇到以下問題。簡寫爲代碼如下所示:使用LINQ訪問表中的第一個元素時出現SQLite錯誤

...

using System.Linq 
using System.Data.Linq 
using System.Data.Linq.Mapping 
using System.Data.SQLite 

...

DataContext sqltContext= new DataContext(sqltConnection); 
featureTable = sqltContext.GetTable<FeatureModel>(); 
count= featureTable.Count(); // count == 1 

下面一行失敗,錯誤: 「SQL邏輯錯誤或丟失的數據庫\ r \ n未知錯誤「

//currentFeature = featureTable.First(); 

但迭代器正常工作:

foreach (var feature in featureTable) 
{ 
    currentFeature = feature; 
    break; 
} 

在這兩種情況下,我得到的調試輸出以下錯誤:

SQLite error (1): near ".": syntax error 

什麼會導致這個錯誤?我希望以前有人看到過這個問題,並可以指出我的方向。但是我可能最終會在調試器中逐步完成System.Data.SQLite代碼。

編輯:基於以下來自GeorgeT的評論,我添加了sqltContext.Log = Console.Out;。根據日誌記錄輸出,看起來LINQ正在生成一個SELECT TOP命令,它與SQLite不兼容。這個問題的解決似乎是避免FirstFirstOrDefault方法,或者使用類似DBLinq

+0

參閱相關的問題http://stackoverflow.com/questions/17280051/sqlite-error-near-s-syntax-error。 – user1929959

+1

這看起來像生成的SQL文本中的錯誤。這個相關的問題的選擇答案鏈接到一篇文章,可能會幫助您看到文本:http://stackoverflow.com/questions/2975554/linq-to-sql-with-sqlite-syntax-error-near-select-when-inserting ?RQ = 1 –

回答

3

調用.First()方法生成使用SELECT TOP命令,這是不兼容的SQLite的SQL查詢。解決方案是避免使用.First()方法,或者使用支持對SQLITE進行LINQ查詢的庫,例如DbLinqLinqConnect

2

由於tdr的回答如前所述.First()生成不正確的SQL,無法使用。我必須將結果轉換爲列表,然後在列表中使用.First()作爲解決方法。這不會是非常有效的,如果結果是非常大的,但:

var item = featureTable.ToList().First(); 
相關問題