2011-03-04 3 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()"); 
      } 
     } 

comment puis-je faire des données aléatoires à partir de DB. 3 d'entre eux. Code je colle ne fonctionne pas très bien.nhibernate données aléatoires de base de données

+0

La question posée est très claire. S'il vous plaît pouvez-vous le reformuler? –

+0

Je crois que @senzacionale demande une méthode pour extraire un échantillon aléatoire de 3 enregistrements d'une base de données en utilisant nhibernate. – mavnn

Répondre

2

Quelque chose comme cela pourrait fonctionner ... mais il va me falloir 2 appels db:

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; 
} 

modifier: aussi, je n'ai pas testé du tout alors qui sait ce qu'il va faire ! Il devrait être au moins sur la bonne voie. Peut-être il y a une manière qui ne nécessite pas de 2 dB appelle

0

En Nhibernate vous pouvez simplement sélectionner des lignes aléatoires comme si en utilisant 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

Ce n'est pas une bonne idée. Pour commencer, il n'a pas spécifié quel DB il utilise, et cela ne fonctionnera qu'avec MSSQL. Vous auriez besoin d'utiliser une autre fonctionnalité spécifique à la base de données si vous vouliez l'utiliser dans MySQL. Plus important encore, cela conduira à des performances de requêtes terribles. Voir [ce post] (http://www.endyourif.com/pourquoi-vous-vous-aviez-pas-d'ordonner-par-rand-or-newid/) pour info. – UpTheCreek

Questions connexes