2010-03-03 20 views
5

so di utilizzare la funzionalitàselezionare le righe n casuali tramite linq2sql

ORDER BY NEWID() 

durante l'esecuzione di un comando regolare sql. Sto volendo fare la stessa cosa, ma via linq2sql.

Preferirei non per selezionare l'intera gamma, aggiungere un numero casuale tramite rnd.Next(), e quindi ordinare da quel ...

risposta

3

Marc Gravell ha pubblicato un solution here che consente di definire una funzione che utilizza NEWID in una classe parziale per DataContext. Non collocarlo nella classe DataContext generata altrimenti gli aggiornamenti futuri eliminerebbero ciò che hai aggiunto.

Marc mostra come utilizzarlo con la sintassi di espressione della query. In alternativa, con notazione del punto, si potrebbe scrivere:

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

Nel caso in cui non hai familiarità con la creazione di una classe parziale, è sufficiente aggiungere una nuova classe per la vostra soluzione. Il suo nome non ha importanza finché la definizione della classe utilizza il nome della classe DataContext con la parola chiave partial. Ad esempio, se il DataContext si chiama XYZDataContext è possibile aggiungere una nuova classe denominata XYZDataContextPartial.cs e definirlo come:

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

perfetto! La soluzione di Marc ha funzionato esattamente come speravo. – benpage

2

provare il metodo Take estensione:

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

Quello che stiamo facendo qui è:

  1. Ordina per campo NEWID per ASC.
  2. Selezionare la prima riga N, dove N è il numero casuale.

Nel caso in cui si desidera che l'ordine essere casuale, provate questo:

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

Quello che stiamo facendo qui è:

  1. Ordina l'elenco in ordine casuale .
  2. Prendere le prime 20 righe.
Problemi correlati