2011-03-04 99 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