¿Cómo puedo cambiar el código a continuación, para obtener cada vez 50 datos aleatorios diferentes de la base de datos?linq: ordenar por orden aleatorio
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);
No creo que esto funcione de todos modos con una base de datos (sin traducción a SQL) y termina siendo O (nlogn) en el mejor de los casos. En cualquier caso, su comparador necesita proporcionar un total de pedidos (no es así). Puede solucionarlo seleccionando un nuevo GUID (una vez) para cada elemento, luego ordenando por eso, pero Fisher-Yates Shuffle (versión de Durstenfeldt) es una mejor opción si está haciendo una selección aleatoria en la memoria. – tvanfosson
-1 http://blogs.msdn.com/b/ericlippert/archive/2011/01/20/spot-the-defect-bad-comparisons-part-one.aspx. en el tiempo t: A> B es verdadero debido a su 'x => Guid.NewGuid()'. en el tiempo t + n: A Guid.NewGuid()'. Las funciones de ordenación no están diseñadas para mezclar elementos y podría dar lugar a un ciclo infinito en el peor de los casos. –
Para ampliar mi sugerencia, '.Seleccione (x => nuevo {Guid = Guid.NewGuid, Question = x}) .OrderBy (x => x.Guid). Seleccione (x => x.Question) .Take (50); 'funcionaría para una selección en memoria PERO usted tiene que ordenarla, que es en promedio O (nlogn) para los mejores algoritmos. El algoritmo de Durstenfeldt funciona tomando una colección e intercambiando cada elemento con un elemento aleatorio en la colección que aún no ha iterado. Esto proporciona un orden aleatorio pero solo requiere operaciones O (n). – tvanfosson