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

时间:2016-03-10 06:24:42

标签: servicestack ormlite-servicestack

我们的代码有一个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()会抛出异常:必须声明标量变量&#34; @ 0&#34;。这已在最近的版本中开始(在4.0.54中测试)。相同的代码工作正常,直到v4.0.50。我已查看发行说明,但无法找到相关更改。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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 params的另一种方法是使用匿名对象,例如:

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