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

我有一个x用户数据库,我想随机获取所有用户,然后在我的网站上写出50个用户。 现在我只使用.take(50)并检索最新的50个用户。 我希望它从整个表中随机抽取50个,任何想法?

这就是我现在的代码:

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

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

试试这个

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

如果可以加载所有用户然后再加载其中的50个,则可以使用这样的while循环:

 List randomUsers = new List(); 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 ids = new List(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个。 这取决于你,这是一个更好的方法。

假设您的实体中有一个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 GetRandomItems(this IEnumerable source, Int32 count) { return source.OrderBy(s => Guid.NewGuid()).Take(count); } } 

现在你可以

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