2009-07-20 18 views
8

ho il seguente codice entità, che restituisce tutti gli utenti e 'comprende' tutte le loro richieste di campioni:LINQ orderby ".include" in sottoquery

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
          orderby u.LastName ascending 
          select u; 

Ogni utente dispone di più SampleRequests. Ogni SampleRequest ha un ID # (solo un numero intero: 1, 22, 341, ecc.). Quanto sopra LINQ to entità afferra gli utenti e le loro SampleRequests in questo modo:

Utente1: 33, 22, 341, 12

Utente2: 24, 3, 981

Come si può vedere la SampleRequest ID # non sono in ordine crescente. Vorrei che i risultati fossero in ordine.

Come faccio a mettere il vincolo orderby sul Incluso SampleRequests ID #

Si prega di notare: SampleRequestId è una proprietà del SampleRequest ... non una proprietà dell'oggetto utente

+1

Aveva lo stesso problema. Trovato ... [http://stackoverflow.com/questions/1304556/linq-orderby-name-thenby-childrencollection-name](http://stackoverflow.com/questions/1304556/linq-orderby-name-thenby- childrencollection-name) – kervin

risposta

8

Attualmente posso pensare a due opzioni per quello che vuoi. È possibile selezionare in una nuova classe, dove l'utente e le richieste associati sono proprietà:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
       orderby u.LastName ascending 
       select new 
       { 
        User = u, 
        SampleRequests = u.SampleRequests.OrderByDescending(r => r.SampleRequestId) 
       }; 

Ciò causerà problemi se si voleva restituire questo tipo, in quanto è anonimo.

È anche possibile selezionare questo in un nuovo oggetto utente, simile a questo:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
       orderby u.LastName ascending 
       select new User 
       { 
        Property1 = u.Property1, 
        Property2 = u.Property2, 
        Property3 = u.Property3, 
        SampleRequests = u.SampleRequests.OrderByDescending(r => r.SampleRequestId).ToList() 
       }; 

Ciò restituirà una raccolta di oggetti Utente, ma aggiornando gli oggetti nel database potrebbe causare problemi.

+1

Se Utente è un'entità EF, non è possibile assegnare il risultato della propria chiamata OrderByDescending(). ToList() (una lista ) alla proprietà SampleRequests su Utente, poiché il suo tipo sarà EntityCollection . Inoltre, sarei diffidente nell'assegnare manualmente ciascuna proprietà nella query; se aggiungi una nuova proprietà all'utente in un secondo momento e dimentichi di aggiornare tutte le tue query, riceverai le istanze utente senza quella proprietà assegnata. IMO potrebbe essere un PITA di manutenzione. –

+0

Trovo questo piuttosto brutto se la tua classe utente ha molte proprietà. Questa sottoraccolta.ToList() effettuerà molti trasferimenti tra business logic e sql-server? Una soluzione potrebbe essere semplicemente recuperare SampleRequests senza ordine e quindi ordinarle in un secondo momento in C# -code (= memoria). –

+0

È necessario creare un indice di database ordinato su UserSet.LastName. E un altro a SampleRequests con (foreign key su UserSet e SampleRequestId) –

-1

Basta aggiungere un altro parametro ordinazione al orderby:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
          orderby u.LastName ascending, 
            u.SampleRequestId descending 
          select u; 
+0

Grazie, ma SampleRequestId è una proprietà di SampleRequests, non dell'oggetto User. –

+0

@ John: questa è l'unica risposta che vedo per quello che hai descritto. Penso che abbiamo bisogno di maggiori informazioni prima. –

+0

OK ho riscritto la mia domanda - penso che potrebbe essere un po 'più chiaro –

-2

Edit: alberato da < 15 secondi.

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
       orderby u.LastName ascending, u.SampleRequestId descending 
       select u; 
+0

Grazie, ma SampleRequestId è una proprietà di SampleRequests include, non dell'oggetto User. –