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
Ответы
Ответ 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();