在 C# 中使用 Linq 或 lambda 从数据库中的表中获取 X 个随机元素

本文关键字:获取 元素 随机 数据库 Linq lambda | 更新日期: 2023-09-27 18:35:29

我有一个包含x数量用户的数据库,我想随机获取所有用户,然后在我的网站上写50个用户。现在我只使用.take(50)并检索最新的 50 个用户。我希望它从整个桌子上随机洗牌 50 个,有什么想法吗?

这是我的代码现在的样子:

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

注意:userlist是我的所有用户列表。 正如你所看到的,我现在正在使用lambda和一个名为userCount的变量,我说出要列出多少用户!

在 C# 中使用 Linq 或 lambda 从数据库中的表中获取 X 个随机元素

试试这个

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

当可以加载所有用户然后获取其中的 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();
}
有两种

方法可以做到这一点,具体取决于系统中的用户数量

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

阿拉伯数字。

迈克打败了我

选项之间的区别在于:1) 涉及对数据库的 2 个查询查询,2) 涉及从数据库加载所有用户,只是为了加载其中的 50 个用户。这取决于你,这是更好的方法。

假设您的实体中有一个 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));

无随机

扩展
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();