2010-03-19 2 views
4

j'ai une question sur la méthode des critères, un à plusieurs rapport à la base de données, « un » est « compte », « beaucoup » est «des sites ", quand j'utilise CreateCriteria() quelque chose ne va pas.Critères d'utilisation NHibernate pour Count(), d'abord()

Comme ceci: SessionFactory.OpenSession().CreateCriteria(typeof(Account)).List().Count();

Avant qu'il ne soit exécuté, je pense que le SQL doit être SELECT COUNT(*) FROM table, mais le SQL est SELECT id, siteurl...FROM table. Alors qu'est-ce qui ne va pas avec ça? Comment puis-je le résoudre?

et méthode First() devrait être SELECT TOP1 ...FROM table, mais il est SELECT ...FROM table

Je suis une recrue Nhiberate, S'il vous plaît aidez-moi.

Répondre

10

Cela se produit car la méthode Count que vous appelez à la fin s'exécute après l'exécution de la requête et en dehors de la base de données. Vous ne comptez que les éléments de la liste en mémoire. Pour réaliser ce que vous cherchez, vous pouvez utiliser une projection:

var count = session 
    .CreateCriteria<Account>() 
    .SetProjection(
     Projections.Count(Projections.Id()) 
    ) 
    .UniqueResult<long>(); 
+0

Dois-je toujours spécifier ant 'IProjection' dans la méthode' Count'? Que faire si je n'ai pas besoin de propriétés, comme 'Count (*)' – monstr

Questions connexes