я использую Asp.net MVC с Архитектурой Sharp.
У меня есть этот код:
return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
.Take(50).ToList();
Как я могу заказать случайным?Примечание: я не хочу заказывать 50 извлеченных объектов, я хочу порядок прежде и затем извлекаю 50 объектов.
thks
Одним из эффективных способов добиться этого является добавление столбца к вашим данным Shuffle
, который заполняется случайным целым числом (при создании каждой записи).
Запрос на доступ к таблице затем становится ...
Random random = new Random();
int seed = random.Next();
result = result.OrderBy(s => (~(s.Shuffle & seed)) & (s.Shuffle | seed)); // ^ seed);
Это выполняет операцию XOR в базе данных и упорядочивает результаты этого XOR.
Преимущества: -
Это подход, используемый моей системой домашней автоматизации для рандомизации списков воспроизведения. Он выбирает новое начальное число каждый день, давая постоянный порядок в течение дня (позволяя легко приостанавливать / возобновлять воспроизведение), но свежий взгляд на каждый список воспроизведения каждый новый день.
Random random = new Random();
return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
.OrderBy(x => r.Next())
.Take(50).ToList();
Вы можете сделать это в T-Sql, как описано здесь. Я не думаю, что вы можете сделать это в linq без загрузки всего набора результатов в память и последующего отбрасывания большей его части, чего вы не хотите делать.
Вероятно, лучше написать свой собственный метод расширения для этого.
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;
}
}
Как насчет этого?
return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
.OrderBy (x => Guid.NewGuid())
.Take(50).ToList();