2011-03-04 95 views
2
IList<Companies> companies = NHibernateSession.CreateCriteria(typeof(Companies)) 
.AddOrder(new RandomOrder())         
            .SetMaxResults(3) 
            .List<Companies>(); 


public class RandomOrder : Order 
     { 
      public RandomOrder() : base("", true) { } 
      public override NHibernate.SqlCommand.SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery) 
      { 
       return new NHibernate.SqlCommand.SqlString("newid()"); 
      } 
     } 

我怎样才能从数据库中随机数据。其中3个。代码粘贴不能很好地工作。nhibernate从数据库中随机数据

+0

被问的问题是非常不清楚随机行。请你能改述一下吗? – 2011-03-04 14:57:03

+0

我相信@senzacionale正在寻求一种方法,使用nhibernate从数据库中提取3条记录的随机样本。 – mavnn 2011-03-04 15:03:59

回答

2

像这样的东西可能工作...虽然这将需要2个调用数据库:

public IEnumerable<Company> GetRandomCompanies(int maxSelections) 
{ 
    try 
    { 
     IList<int> companyIds = _session.CreateCriteria<Company>() // get all available company ids 
      .SetProjection(LambdaProjection.Property<Company>(c => c.Id)).List<int>(); 

     return _session.CreateCriteria<Company>() 
      .Add(Restrictions.In(LambdaProjection.Property<Company>(c => c.Id), GetRandomCompanyIds(companyIds.ToList(), maxSelections))) // get 3 random Ids 
      .List<Company>(); 
    } 
    catch (Exception xpt) 
    { 
     ErrorSignal.FromCurrentContext().Raise(xpt); 
    } 

    return new List<Company>(); 
} 

private List<int> GetRandomCompanyIds(List<int> companyIds, int maxSelections) 
{ 
    List<int> randomIds = new List<int>(); 

    for (int i = 0; i <= maxSelections; i++) 
    { 
     // this will get you the same result all day, new next day 
     // it might not be what you need, so you could just use a new seed. 
     Random rng = new Random(DateTime.Now.DayOfYear); 
     randomIds.Add(companyIds[rng.Next(companyIds.Count)]); 
    } 

    return randomIds; 
} 

编辑:还,我还没有测试这在所有所以谁知道它会做!它应该至少在正确的轨道上。也许有不需要2 dB的方式调用

0

在NHibernate中,你可以简单地选择像这样使用SQL

var query = "SELECT top 3 * from [Companies] ORDER BY NEWID()"; 
ISQLQuery qry = session.CreateSQLQuery(query).AddEntity(typeof(Companies)); 
Companies randomCompanies = qry.List<Companies>(); 
+0

这不是一个好主意。首先,他没有指定他正在使用的数据库,这只适用于MSSQL。如果你想让它在MySQL中工作,你将不得不使用不同的数据库特定功能。更重要的是,这会导致可怕的查询性能。有关信息,请参阅[本文](http://www.endyourif.com/why-you-should-avoid-order-by-rand-or-newid/)。 – UpTheCreek 2011-05-02 09:00:01