Comment puis-je changer le code ci-dessous pour obtenir à chaque fois 50 données aléatoires différentes de la base de données?
return (from examQ in idb.Exam_Question_Int_Tbl
where examQ.Exam_Tbl_ID==exam_id
select examQ).OrderBy(x=>x.Exam_Tbl_ID).Take(50);
http://msdn.Microsoft.com/en-us/library/system.guid.newguid.aspx
return (from examQ in idb.Exam_Question_Int_Tbl
where examQ.Exam_Tbl_ID==exam_id
select examQ).OrderBy(x => Guid.NewGuid()).Take(50);
S'il s'agit de LINQ-to-SQL, vous pouvez simplement ajouter une ORDER BY NEWID()
à votre instruction SELECT.
Comme indiqué, il pourrait être préférable d'utiliser un algorithme comme Fisher-Yates Shuffle , voici une implémentation: https://stackoverflow.com/a/375446/28424
Quelle est la taille de la collection? Pouvez-vous les sélectionner tous en mémoire puis choisir une collection aléatoire? Si c'est le cas, l'algorithme Shuffle à Est-ce que Random et OrderBy est un bon algorithme de lecture aléatoire? serait un bon choix.
return idb.Exam_Question_Int_Tbl
.Where( e => e.Exam_Tbl_ID == exam_id )
.ToList()
.Shuffle()
.Take( 50 );
Sinon, je suggère une procédure stockée qui effectue une commande par newid()
( SQL Server Random Sort ). Je ne pense pas qu'il existe un moyen de traduire une expression basée sur un générateur de nombres aléatoires en C # vers LINQ vers SQL/Entities.
Si vous avez le même problème, j'ai eu ...
int Limit = 24;
return (from Q in Context.table
where Q.some_key == 1234
select new classDataType() {
FirstAttribute = Q.FirstCol,
SecondAttribute = Q.SecondCol,
ThirdAttribute = Q.ThirdCol
}).ToList().OrderBy(x => Guid.NewGuid()).Take(Limit).ToList();
Après sql-linq, il doit s'agir d'une LISTE, donc vous devrez peut-être modifier une liste avant d'utiliser la méthode OrderBy-NewGuid:
return (...-SQL-SELECT-LINQ-...)
.ToList() //****
.OrderBy(x => Guid.NewGuid()).Take(Limit).ToList();