使用LINQ访问表中第一个元素时出现SQLite错误

3
当我使用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正在生成一个不兼容SQLite的SELECT TOP命令。解决方法似乎是避免使用FirstFirstOrDefault方法,或者使用类似DBLinq的东西。

请参见相关问题https://dev59.com/LXPYa4cB1Zd3GeqPl6-k。 - Mihai8
1
这似乎是生成的SQL文本中的错误。此相关问题的所选答案链接到一篇文章,可能会帮助您查看该文本:http://stackoverflow.com/questions/2975554/linq-to-sql-with-sqlite-syntax-error-near-select-when-inserting?rq=1 - George T
2个回答

3

调用.First()方法会生成一个使用SELECT TOP命令的SQL查询,该命令与SQLite不兼容。解决方法是避免使用.First()方法,或者使用支持LINQ查询到SQLITE的库,例如DbLinqLinqConnect


2

正如tdr的回答所提到的那样,First()会生成不正确的SQL,不能使用。我不得不将结果转换为列表,然后在列表上使用First()来解决问题。如果结果非常大,这种方法效率可能不高。

var item = featureTable.ToList().First();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接