2016-03-10 4 views
1

Наш код имеет SqlExpression, что на ее голую минимум что-то вроде:Исключение в OrmLite: Необходимо объявить скалярную переменную

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(*)?

ответ

1

Теперь, когда OrmLite по умолчанию параметризованных запросов вы также должны обеспечить запросы дБ параметров при выполнении запроса (если вы указали любой Params), например:

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); 

В противном случае другой способ указать дб Params является использование анонимного объекта, например:

db.Scalar<int>("SELECT COUNT(*) FROM Users WHERE [email protected]", new { age = 25}); 
+0

Как бы вы справиться с этим сценарием, где вы не знаете, что были добавлены PARAMS есть и ваше выражение запрос был построен динамически ? – James

+0

@James Я не понимаю вопроса, который первый ответ показывает, используя типизированное выражение SQL, я также обновил свой ответ, чтобы показать, используя явные API-интерфейсы OrmLite, в то время как последний пример показывает использование параметризованного SQL. – mythz

+0

Извините - я нашел то, что мне было нужно: conn.Scalar (query.ToCountStatement(), query.Params); – James