Подтвердить что ты не робот

Linq Orderby random ThreadSafe для использования в ASP.NET

Я использую Asp.net MVC с Sharp Architecture.

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

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

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

Thks

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

Random random = new Random();
return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
                .OrderBy(x => r.Next())
                .Take(50).ToList();

Ответ 4

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

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

Ответ 5

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

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