случайные данные из базы данных - PullRequest
2 голосов
/ 04 марта 2011
    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 из них. Код, который я вставил, работает не очень хорошо.

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

Нечто подобное может сработать ... хотя для этого потребуется 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;
}

edit: Кроме того, я вообще не проверял это, так что кто знает, что он будет делать! Это должно быть по крайней мере на правильном пути. Может быть, есть способ, который не требует 2 дБ вызовов

0 голосов
/ 29 марта 2011

В 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>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...