2010-03-12 11 views
5

Aquí está mi consulta LINQ:OrdenarPor y distinto utilizando entidades LINQ-a-

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

aquí está el resultado:

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

Aquí es el SQL generado:

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

¿Es esto un error? ¿Dónde está mi pedido, maldita sea?

Respuesta

10

Debe ordenar despuésDistinct ya que no viene con ninguna garantía de preservar el orden:

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

Este código no se compila. OrderBy da el error: 'Los argumentos de tipo no se pueden deducir del uso. Intente especificar los argumentos de tipo explícitamente. –

+0

Oh, veo, tiene que ser 'OrderBy (o => o)' ya que en ese punto los elementos ya han sido seleccionados (y estamos trabajando con un 'IQueryable '). He corregido tu código y te he dado la marca de verificación. ¡Gracias! –

+0

@BlueRaja: Sí, lo eché de menos. ¡Gracias por la corrección! –

1

Esta pregunta se analizan las reglas para LINQ a Objetos: Preserving order with LINQ

En el base de datos, incluso menos operaciones conservan el orden. Nadie en ninguna parte conserva el orden cuando Distinct'ing (como generalmente se usa un algoritmo Hash).

+0

Aún así, la consulta 'SELECT DISTINCT ... ORDER BY ...' funciona como se esperaría en SQL Server, y probablemente en otros DBMS - ¿hay alguna razón por la cual la cláusula LINQ 'orderby' simplemente se ignore en este caso al generar el SQL (al menos podría arrojar un error)? Sigo pensando que esto es un error: la consulta LINQ funciona correctamente cuando se usa en un 'String []'. –

+0

Si marca el plan de consulta, revelará que ORDER BY se produce después de DISTINCT. Como tal, existen limitaciones estrictas sobre lo que puede aparecer en el ORDER BY. Este es solo otro caso donde la sintaxis de SQL causa confusión. –

+0

¿Cuál es el "plan de consulta" y cómo lo veo? Obtuve la consulta anterior usando el Analizador de SQL Server 2008, pero obviamente solo te da la consulta final. –