Получить X случайных элементов из таблицы в базе данных с помощью Linq или lambda в С#

У меня есть база данных с количеством пользователей x, и я хочу случайно получить всех пользователей, а затем написать, как 50 пользователей на моем сайте. Сейчас я использую .take(50) и извлекаю 50 последних пользователей. Я хочу, чтобы он перетасовал 50 случайных значений из всей таблицы, Любые идеи?

Вот как выглядит мой код:

userList = userList.OrderBy(user => -user.ID).Take(userCount).ToList();

ПРИМЕЧАНИЕ. userlist - это список всех пользователей. и, как вы можете видеть, я в данный момент использую лямбда с переменной userCount, где я говорю, сколько пользователей нужно перечислять!

Ответ 1

Попробуйте это

Random rnd = new Random();
userList = userList.OrderBy(user => rnd.Next()).Take(usercount).ToList();

Ответ 2

Есть два способа сделать это в зависимости от того, сколько пользователей в вашей системе

1.

List<int> ids = new List<int>(50);
int total = userList.Count();
Random r = new Random();
while (ids.Count() < 50)
{
    var next = r.Next(total);
    if (!ids.Contains(next))
        ids.Add(next);
}
var users = userList.Where(a => ids.Contains(a.ID));

2.

MikeSW победил меня в этом

Разница между параметрами заключается в том, что 1) включает в себя 2 запроса запросов к базе данных и 2) включает загрузку всех пользователей из базы данных только для загрузки 50 из них. Это для вас, что является лучшим способом сделать это.

Ответ 3

Когда вы можете загрузить всех пользователей, а затем взять 50 из них, вы можете использовать цикл while следующим образом:

List<object> randomUsers = new List<User>();
Random r = new Random();
while (randomUsers.Count < 50)
{
    userList
      // skip previously selected users
      .Except(randomUsers)
      // random number to skip a random amount of users
      .Skip(r.Next(0, userList.Count() - 1 - randomUsers.Count))
      // and then take the next one
      .First();
}

Ответ 4

Предполагая, что у вас есть столбец первичного ключа Id в вашей сущности, я бы рекомендовал использовать следующий запрос, или вы будете приводить к большому количеству данных без каких-либо причин.

var rnd = new Random();

// Get the employeeIds.
var employeeIds = EmployeeService.Data()
    .Select(e => e.Id)
    .ToList();

// Choose n number of random employeeIds.
var randomEmployeeIds = employeeIds
    .OrderBy(id => rnd.Next())
    .Take(x);

// Get random employees.
var employees = EmployeeService.Data().Where(emp => randomEmployeeIds.Contains(emp.Id));

Ответ 5

Расширение без случайного

public static class MyExtensions
{
    public static IEnumerable<T> GetRandomItems<T>(this IEnumerable<T> source, Int32 count)
    {
        return source.OrderBy(s => Guid.NewGuid()).Take(count);
    }
}

И теперь вы можете

userList = userList.GetRandomItems().ToList();