Linq Order by randomSafe для использования в ASP.NET - PullRequest
12 голосов
/ 27 июля 2010

Я использую Asp.net MVC с архитектурой Sharp.

У меня есть этот код:

return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
                .Take(50).ToList();

Как я могу заказать случайно? Примечание: я не хочу заказывать 50 извлеченных предметов, я хочу заказать раньше, а затем извлечь 50 предметов.

Thks

Ответы [ 5 ]

32 голосов
/ 27 июля 2010

Один из способов добиться эффективного результата - добавить к вашим данным столбец Shuffle, который заполнен случайным числом int (при создании каждой записи).

Запрос на доступ к таблице становится ...

Random random = new Random();
int seed = random.Next();
result = result.OrderBy(s => (~(s.Shuffle & seed)) & (s.Shuffle | seed)); // ^ seed);

Это делает операцию XOR в базе данных и упорядочивает по результатам этого XOR.

Преимущества: -

  1. Эффективно: SQL обрабатывает заказывать, не нужно получать все таблица
  2. Повторяется: (хорошо для тестирование) - можно использовать тот же случайный семя, чтобы генерировать тот же случайный заказ
  3. Работает на большинстве (всех?) Поддерживаемых Entity Framework базы данных

Это подход, используемый моей системой домашней автоматизации для рандомизации списков воспроизведения. Каждый день он выбирает новое начальное число, давая последовательный порядок в течение дня (что позволяет легко делать паузу / возобновление), но каждый новый взгляд на каждый плейлист по-новому.

2 голосов
/ 27 июля 2010

Вы можете сделать это в T-Sql, как описано здесь . Я не думаю, что вы можете сделать это в linq, не загружая весь набор результатов в память, а затем выбрасывая большую часть его, что вы не хотите делать.

1 голос
/ 27 июля 2010

Вероятно, лучше написать собственный метод расширения, чтобы сделать это.

public static class Extensions
{
    static readonly Random random = new Random();

    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> items)
    {
        return Shuffle(items, random);
    }

    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> items, Random random)
    {
        // Un-optimized algorithm taken from
        // http://en.wikipedia.org/wiki/Knuth_shuffle#The_modern_algorithm
        List<T> list = new List<T>(items);
        for (int i = list.Count - 1; i >= 1; i--) 
        {
            int j = random.Next(0, i);
            T temp = list[i];
            list[i] = list[j];
            list[j] = temp;
        }
        return list;
    }
}
1 голос
/ 27 июля 2010
Random random = new Random();
return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
                .OrderBy(x => r.Next())
                .Take(50).ToList();
0 голосов
/ 27 июля 2010

Как насчет этого?

return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
  .OrderBy (x => Guid.NewGuid())
  .Take(50).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...