2009-12-08 24 views
2

Comment sélectionner 5 enregistrements aléatoires en utilisant nhibernate.Comment obtenir des lignes aléatoires avec nhibernate?

Mon sql ressemble à ceci:

SELECT TOP 5 u.UserId, u.UserName, p.ImageFileName FROM users as u, profiles as p WHERE u.UserId = p.UserId ORDER BY NEWID() 

J'ai essayé de le faire, mais cela ne fonctionne pas

IList<User> users = session 
         .CreateCriteria(typeof(User)) 
         .CreateCriteria("Profile") 
         .Add<Profile>(p => p.ImageFileName != string.Empty) 
         .AddOrder(Order.Asc("NEWID()")) 
         .SetMaxResults(5) 
         .List<User>(); 
+1

similaires à http: //stackoverflow.com/questions/729687/how-do-i-select-a-random-row-using-nhibernates-icriteria-api. – Joel

Répondre

1

Vous pouvez utiliser un SQLQuery:

var query = 
    "SELECT TOP 5 u.UserId, u.UserName, p.ImageFileName " + 
    "FROM users as u, profiles as p " + 
    "WHERE u.UserId = p.UserId ORDER BY NEWID()"; 

ISQLQuery qry = session.CreateSQLQuery(query).AddEntity(typeof(User)); 
List<User> rndUsers = qry.List<User>(); 
+0

Rappelez-vous, la question mentionnée par Joel Potter dans un commentaire a une réponse plus élégante. –

+0

Pouvez-vous utiliser des disjonctions avec cela? J'ai un problème similaire, et j'ai pensé à cette solution, mais j'ai besoin d'appliquer des objets de disjonction prédéfinis. – Astaar

+0

Vous pouvez fournir n'importe quel SQL que vous aimez - c'est NHIbernate, mais c'est juste créer une requête SQL qui sera exécutée par la base de données. Si vous ne commandez pas par hasard, vous obtiendrez toujours les mêmes enregistrements. –

Questions connexes