2011-08-08 17 views
14

Utilizzo di VB.net e della seguente istruzione LINQ. Sospetto che "Ordina per" non funzioni con Concat(). Voglio elencare l'elemento corrente che l'utente ha e quindi elencare più elementi disponibili in ordine crescente. Quindi per prima cosa seleziono l'elemento corrente dal db e poi seleziono i prossimi articoli disponibili in ordine. LINQ sta ignorando l'ordine per istruzione e ordinamento da parte del PK (che è itemID) Ho esaminato l'elenco immediatamente dopo l'esecuzione dell'istruzione. Quando divido la dichiarazione e le faccio separatamente, funzionano come previsto. Qualsiasi idea, suggerimento o commento. Grazie, PML'ordine non funziona con Concat() in LINQ

(From items In myDatabase.ItemAssignments _ 
Where items.BuildingID = buildingID _ 
And items.ResidentID = ResidentID _ 
Select items).Concat(From moreitems In myDatabase.ItemAssignments _ 
         Where moreitems.occupied = 0 _ 
         And moreitems.BuildingID = buildingID _ 
         Order by moreitems.Floor, moreitems.ItemNumber _ 
         Select moreitems) 

risposta

14

Il Concat effettivamente ignorare la clausola ORDER BY quando si tratta di LINQ to SQL. Questo può essere verificato dall'SQL generato se si utilizza LINQPad o si imposta DataContext.Log property.

Un modo per gestire questo è introdurre un valore fittizio tramite un tipo anonimo per facilitare l'ordine. Ho suddiviso le query di seguito per chiarezza, anche se lo stesso approccio è possibile utilizzando la sintassi della query che è stata avviata fino a quando non è necessario specificare l'ordine.

Dim firstQuery = From items In myDatabase.ItemAssignments _ 
       Where items.BuildingID = buildingID _ 
       And items.ResidentID = ResidentID _ 
       Select New With { .Row = items, .Order = 1 } 
Dim secondQuery = From moreitems In myDatabase.ItemAssignments _ 
        Where moreitems.occupied = 0 _ 
        And moreitems.BuildingID = buildingID _ 
        Select New With { .Row = moreitems, .Order = 2 } 

Dim query = firstQuery.Concat(secondQuery) _ 
         .OrderBy(Function(o) o.Order) _ 
         .ThenBy(Function(o) o.Row.Floor) _ 
         .ThenBy(Function(o) o.Row.ItemNumber) _ 
         .Select(Function(o) o.Row) 

Un'altra opzione meno desiderabile è quello di chiamare il AsEnumerable method su una delle query, che farà rientrare i risultati dal database. A seconda del numero di articoli coinvolti e se è necessario un ulteriore filtraggio, ciò potrebbe avere effetti negativi sulle prestazioni.

Per utilizzare questo questo approccio modificare la prima parte della query originale da utilizzare:

From items In myDatabase.ItemAssignments.AsEnumerable() ... 

L'ordinamento sulla seconda parte sarà poi funzionare come previsto e il codice SQL generato rifletterà tanto.