2010-03-12 19 views
5

ecco la mia query LINQ:OrderBy e distinti utilizzando LINQ to Entities

(from o in entities.MyTable 
orderby o.MyColumn 
select o.MyColumn).Distinct(); 

Ecco il risultato:

{"a", "c", "b", "d"} 

Ecco l'SQL generato:

SELECT 
[Distinct1].[MyColumn] AS [MyColumn] 
FROM (SELECT DISTINCT 
    [Extent1].[MyColumn] AS [MyColumn] 
    FROM [dbo].[MyTable] AS [Extent1] 
) AS [Distinct1] 

è un insetto? Dov'è il mio ordine, dannazione?

risposta

10

Si dovrebbe ordinare dopoDistinct in quanto non sono dotati di alcuna garanzia di preservare l'ordine:

entities.MyTable.Select(o => o.MyColumn).Distinct().OrderBy(o => o); 
+0

Questo codice non viene compilato. OrderBy fornisce l'errore: 'Gli argomenti di tipo non possono essere dedotti dall'utilizzo. Prova a specificare esplicitamente gli argomenti del tipo. –

+0

Oh capisco, deve essere 'OrderBy (o => o)' dato che a quel punto gli elementi sono già stati selezionati (e stiamo lavorando con un 'IQueryable '). Ho corretto il tuo codice e ti ho dato il segno di spunta - Grazie! –

+0

@BlueRaja: Sì, l'ho perso. Grazie per la correzione! –

1

Questa domanda descrive le regole per LINQ to Objects: Preserving order with LINQ

Nel database, ancora meno operazioni preservano l'ordine. Nessuno ovunque conserva l'ordine quando Distinct'ing (come in genere viene utilizzato un algoritmo di hash).

+0

Ancora, la query 'SELECT DISTINCT ... ORDER BY ...' funziona come ci si aspetterebbe da SQL Server, e probabilmente in altri DBMS - c'è un motivo per cui la clausola LINQ 'orderby' viene semplicemente ignorata in questo caso quando si genera l'SQL (potrebbe almeno generare un errore)? Continuo a pensare che questo sia un bug - la query LINQ funziona correttamente quando viene usata su un 'String []'. –

+0

Se si controlla il piano di query, verrà rivelato che ORDER BY si verifica dopo il DISTINCT. In quanto tale, ci sono rigorose limitazioni su ciò che può apparire nell'ORDINE BY. Questo è solo un altro caso in cui la sintassi di SQL causa confusione. –

+0

Qual è il "piano di query" e come lo visualizzo? Ho ottenuto tale query sopra utilizzando SQL Server 2008 Profiler, ma ovviamente ti fornisce solo la query finale. –

Problemi correlati