【问题标题】:Exception in OrmLite: Must declare the scalar variableOrmLite 中的异常:必须声明标量变量
【发布时间】:2016-03-30 01:59:34
【问题描述】:

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

【问题讨论】:

    标签: servicestack ormlite-servicestack


    【解决方案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.Scalar<int>("SELECT COUNT(*) FROM Users WHERE Age=@age", new { age = 25});
    

    【讨论】:

    • 如果您不知道添加了哪些参数并且您的查询表达式已动态构建,您将如何处理?
    • @James 我不明白第一个答案使用类型化 SQL 表达式显示的问题,我还更新了我的答案以使用 OrmLite 的显式计数 API 显示,而最后一个示例显示使用参数化 SQL。
    • 抱歉 - 我找到了我需要的东西:conn.Scalar(query.ToCountStatement(), query.Params);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多