2010-03-03 16 views
5

sé de utilizar la función deseleccionar filas n al azar a través de linq2sql

ORDER BY NEWID() 

cuando se ejecuta un comando sql regulares. Quiero hacer lo mismo, pero a través de linq2sql.

preferiría no para seleccionar toda la gama, añadir en un número aleatorio a través de rnd.Next(), y luego ordenar por eso ...

Respuesta

3

Marc Gravell publicó solution here que le permite definir una función que usa NEWID en una clase parcial para el DataContext. No lo coloque en la clase DataContext generada; de lo contrario, las actualizaciones futuras eliminarán lo que ha agregado.

Marc muestra cómo usarlo con la sintaxis de la expresión de consulta. Alternativamente, la notación de puntos, se podría escribir:

var results = dc.Table.OrderBy(r => dc.Random()).Take(n); 

En caso de que usted no está familiarizado con la creación de una clase parcial, sólo tiene que añadir una nueva clase a su solución. Su nombre no importa siempre que la definición de clase use el nombre de la clase DataContext con la palabra clave partial. Por ejemplo, si su DataContext se llama XYZDataContext puede agregar una nueva clase llamada XYZDataContextPartial.cs y definirlo como:

namespace YourNamespace 
{ 
    public partial class XYZDataContext 
    { 
    } 
} 
+0

perfecto! La solución de Marc funcionó exactamente como esperaba. – benpage

2

probar el método de Take extensión:

.OrderBy(x=>x.NewId) 
.Take(randomNumber); 

Lo que estamos haciendo aquí es:

  1. Ordenar por NewID campo con el fin de ASC.
  2. Seleccione la primera fila N, donde N es el número aleatorio.

En caso de que desee que el fin ser al azar, intente esto:

.OrderBy(x => Guid.NewGuid()) 
.Take(20); 

Lo que estamos haciendo aquí es:

  1. Orden de la lista en un orden aleatorio .
  2. Tome las 20 filas superiores.
Cuestiones relacionadas