我们的代码有一个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(*)
生成更优化的查询?
答案 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});