Linq Orderby случайный ThreadSafe для использования в ASP.NET

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

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

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

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

thks

12
задан Chris Marisic 17 September 2014 в 17:30
поделиться

5 ответов

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

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

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

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

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

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

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

32
ответ дан 2 December 2019 в 04:25
поделиться
Random random = new Random();
return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
                .OrderBy(x => r.Next())
                .Take(50).ToList();
1
ответ дан 2 December 2019 в 04:25
поделиться

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

2
ответ дан 2 December 2019 в 04:25
поделиться

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

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
ответ дан 2 December 2019 в 04:25
поделиться

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

return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
  .OrderBy (x => Guid.NewGuid())
  .Take(50).ToList();
-2
ответ дан 2 December 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: