2009-12-08 103 views
2

如何使用nhibernate选择5个随机记录。如何使用nhibernate获得随机行?

我的SQL是这样的:

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

我试图这样做,但它不工作

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

类似于http: //stackoverflow.com/questions/729687/how-do-i-select-a-random-row-using-nhibernates-icriteria-api。 – Joel 2009-12-08 20:02:08

回答

1

您可以使用的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

请注意,Joel Potter在评论中提到的问题有一个更优雅的答案。 – 2009-12-13 03:31:26

+0

你可以使用这种不连续?我有一个类似的问题,并想到该解决方案,但我需要应用预定义的Disjunction对象。 – Astaar 2012-05-05 12:33:37

+0

您可以提供任何你喜欢的SQL - 这是NHIbernate,但它只是创建一个将由数据库运行的SQL查询。但是,如果您没有随机订购,您将始终获得相同的记录。 – 2012-05-05 16:45:58