返回IQueryable.First()报错: Microsoft.Data.Sqlite.SqliteException:“SQLite Error 1: 'no such column: t.Value'.”

问题现象

使用EF core获取SQLite的sequence 时一直有此错误:Microsoft.Data.Sqlite.SqliteException:“SQLite Error 1: 'no such column: t.Value'.”

 

以下是出错代码:

 var id = DbContext.Instance.Database.SqlQuery<int>($"SELECT seq+1 FROM sqlite_sequence WHERE name='deviceInfo'").First();

 

排查过程

通过不断的尝试后,发现取消First()就是正常的,一旦要使用First()方法就会异常,怀疑IQueryable.First()实现应该是有问题。

询问了下GPT,其给出的原因如下:

 

按其所述将上述代码改为了如下,多次测试没有问题.

var id = DbContext.Instance.Database.SqlQuery<int>($"SELECT seq+1 FROM sqlite_sequence WHERE name='deviceInfo'").ToList().First();

 另上述代码中,若将

name='deviceInfo'

采用"{}" 插值的方式,也是有问题的,报错如下:

报此错误的代码如下:

 string tableName = "deviceInfo";
 var id = DbContext.Instance.Database.SqlQuery<int>($"SELECT seq+1 FROM sqlite_sequence WHERE name='{tableName}'").ToList().First();

 

 不得以只能将其写成硬代码。各位若有更好的解决办法,望留言。

望本文能帮助各位避此大坑……

 

原因分析

从查询资料与AI给出的结果来看,大概率是IQueryable<T>的实现应该是有一些问题。 

解决办法

在排查过种已经有所介绍,即将查询到的IQueryable<T>转化为list,然后再做处理即可。

 

注意:不要使用插值方式写sql语句,否则会造成sql漏洞,会导致数据库被提权,此一定要注意。推荐进行参数化查询,以避免此问题。

 

posted @ 2023-06-25 17:51  盛沧海  阅读(218)  评论(0)    收藏  举报