OrmLite 中的异常:必须声明标量变量

Exception in OrmLite: Must declare the scalar variable

我们的代码有一个 SqlExpression,它的最低限度类似于:

var q = db.From<Users>();

q.Where(u => u.Age == 25);

totalRecords = db.Scalar<int>(q.ToCountStatement());

q.ToCountStatement() 生成以下查询:

SELECT COUNT(*) FROM "Users" WHERE ("Age" = @0)

但是,db.Scalar() 抛出异常:必须声明标量变量“@0”。这已经开始出现在最近的版本中(在 4.0.54 中测试)。相同的代码在 v4.0.50 之前工作正常。我查看了发行说明,但找不到相关的更改。

即使传递参数也会引发相同的异常:

totalRecords = db.Scalar<int>(q.ToCountStatement(), 25);

这是一个错误,还是我的疏忽?

其次,是否可以让 q.ToCountStatement() 使用 COUNT(Age)COUNT([PrimaryKey]) 而不是 COUNT(*) 生成更优化的查询?

现在 OrmLite 默认为参数化查询,您还需要在执行查询时提供查询数据库参数(如果您指定了任何参数),例如:

var q = db.From<Users>().Where(u => u.Age == 25);
var count = db.Scalar<int>(q.ToCountStatement(), q.Params);

您也可以使用 OrmLite 的显式 Count() API,例如:

db.Count<User>(x => x.Age == 25);

或者使用类型化的 SqlExpression:

var q = db.From<User>().Where(x => x.Age == 25);
db.Count(q);

否则另一种指定数据库参数的方法是使用匿名对象,例如:

db.Scalar<int>("SELECT COUNT(*) FROM Users WHERE Age=@age", new { age = 25});