2013-10-16 6 views
10

Ich habe eine Datenbank mit x Menge Benutzer und ich möchte nach dem Zufallsprinzip alle Benutzer und schreiben Sie dann wie 50 Benutzer auf meiner Website. Im Moment verwende ich nur .take(50) und ruft die neuesten 50 Benutzer ab. Ich will es 50 zufällig aus dem ganzen Tisch mischen, Irgendwelche Ideen?Get X zufällige Elemente aus der Tabelle in der Datenbank mit Linq oder Lambda in C#

Dies ist, was mein Code sieht aus wie jetzt:

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

HINWEIS:userlist meiner Liste aller Nutzer ist. Und wie Sie sehen können, benutze ich im Moment Lambda mit einer Variablen namens userCount, wo ich sage, wie viele Benutzer aufgelistet werden sollen!

+0

Ich möchte eine Art Zufalls Verwendung in dieser ofcourse. Aber ich weiß nicht, wie :( – user2862542

Antwort

23

Versuchen Sie, diese

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

Hehe danke! Es funktioniert :) Kinda easy lol, Sollte es von mir selbst herausgefunden! :) – user2862542

+0

Ich werde ur Posts als "richtig" markieren müssen 5 Minuten warten tho :) @MikeSW – user2862542

+0

Geht die 'order by' Klausel davon aus, dass die vom' rnd' Objekt zurückgegebene Zahl eine Benutzerkennung ist? Was ich meine ist, ist es möglich, eine ID zu bekommen, die nicht existiert? –

0

Es gibt zwei Möglichkeiten, dies zu tun, je nachdem, wie viele Benutzer in Ihrem System

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 Beat Ich zu diesem

Der Unterschied zwischen den Optionen besteht darin, dass 1) 2 Abfragen an die Datenbank und 2) das Laden aller Benutzer aus der Datenbank umfasst, um nur 50 von ihnen zu laden. Es liegt an Ihnen, was ein besserer Weg ist.

0

Wenn es in Ordnung ist, alle Benutzer zu laden und dann 50 von ihnen nehmen, können Sie eine while-Schleife wie folgt verwenden:

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(); 
} 
0

Angenommen, Sie haben eine Id Primärschlüsselspalte in Ihrem Unternehmen würde ich empfehlen Verwenden Sie die folgende Abfrage oder Sie werden viele Daten ohne Grund herunterbringen.

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

Erweiterung ohne Zufalls

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

Und jetzt können Sie

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