2016-03-10 1 views
1

Notre code a une SqlExpression, qui, à son strict minimum est quelque chose comme:Exception dans OrmLite: doit déclarer la variable scalaire

var q = db.From<Users>(); 

q.Where(u => u.Age == 25); 

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

q.ToCountStatement() génère la requête suivante:

SELECT COUNT(*) FROM "Users" WHERE ("Age" = @0) 

Cependant, db.Scalar() lève une exception: Doit déclarer la variable scalaire "@ 0". Cela a commencé à se produire dans les versions récentes (testé en 4.0.54). Le même code fonctionnait bien jusqu'à la version 4.0.0. J'ai vérifié les notes de version, mais je n'ai pas trouvé de changement lié.

passant Même un paramètre plaids la même exception:

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

Est-ce un bug ou mon contrôle?

Deuxièmement, est-il possible d'obtenir q.ToCountStatement() pour générer une requête plus optimisée avec COUNT(Age) ou COUNT([PrimaryKey]) au lieu de COUNT(*)?

Répondre

1

Maintenant que les paramètres par défaut OrmLite aux requêtes paramétrées vous devez également fournir les requêtes des paramètres db lors de l'exécution d'une requête (si vous avez spécifié les params), par exemple:

var q = db.From<Users>().Where(u => u.Age == 25); 
var count = db.Scalar<int>(q.ToCountStatement(), q.Params); 

Vous pouvez également utiliser explicite de OrmLite Count() des API, par exemple:

db.Count<User>(x => x.Age == 25); 

ou avec un SqlExpression typé:

var q = db.From<User>().Where(x => x.Age == 25); 
db.Count(q); 

Sinon, une autre façon de spécifier db params est d'utiliser un objet anonyme, par exemple:

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

Comment réagiriez-vous ce scénario où vous ne savez pas ce params ont été ajoutées et l'expression de votre requête a été construit de façon dynamique ? – James

+0

@James Je ne comprends pas la question que la première réponse montre en utilisant une expression SQL typée, j'ai également mis à jour ma réponse pour montrer en utilisant les API Count explicites d'OrmLite alors que le dernier exemple montre l'utilisation de SQL paramétré. – mythz

+0

Désolé - j'ai trouvé ce dont j'avais besoin: conn.Scalar (query.ToCountStatement(), query.Params); – James