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});
我们的代码有一个 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});