2010-05-25 21 views
27

estoy usando la siguiente sintaxis de consultaLINQ to SQL OrdenarPor thenby

from table 
where 
where 
orderby 
orderby 

Cuando la primera OrdenarPor es una fecha y una segunda OrdenarPor es una fecha. Asumiría que esto funcionaría como una orden por entonces pero parece estar haciendo otra cosa.

  1. ¿Cómo puedo hacer una orden utilizando la sintaxis anterior sin usar la sintaxis de extensión? (Lo tengo)

  2. ¿Y qué hace el orden, orden?

Respuesta

43

¿Cómo puedo hacer un pedido al mismo tiempo utilizando la sintaxis anterior sin usar la sintaxis de extensión.

utilizar una coma entre los campos:

orderby a, b 

Y lo que hace el orderby, orderBy hacer?

Cuando se utiliza orderby dos veces seguidas los elementos conceptualmente primero se ordenarán utilizando la primera orderby, y luego ordenados de nuevo utilizando la segunda orderby. Debido a que la clasificación se define como un stable sort (objetos que están vinculados con el segundo orderby permanecerá en el mismo orden que después de la clasificación con la primera orderby de manera efectiva significa que este:

var query = from x in l 
      orderby x.A 
      orderby x.B 
      select x; 

es equivalente a:

var query = from x in l 
      orderby x.B, x.A 
      select x; 

El resultado es que los términos se intercambian orderby de lo que es probable que pretendía.

Prueba con LINQ a SQL

Esto se puede verificar intentándolo en LINQ to SQL. He creado la siguiente consulta:

var query = from a in dc.Orders 
      orderby a.Date 
      orderby a.CustomerID 
      select a; 

y este era el SQL generado:

SELECT [t0].[ID], [t0].[CustomerID], [t0].[Date], [t0].[Description] 
FROM [dbo].[Order] AS [t0] 
ORDER BY [t0].[CustomerID], [t0].[Date] 

Tenga en cuenta que la orderby a.Date no se ignora. Ambos términos están incluidos en la cláusula ORDER BY, pero en el orden opuesto al que podría haber pensado.

+0

Según la especificación, OrderBy siempre es una clasificación estable (independientemente del proveedor de LINQ). Lo que eso significa es "si las claves de dos elementos son iguales, se conserva el orden de los elementos". Si OrderBy's encadenado conservará o no el orden depende de las claves que se usen, no del proveedor LINQ (aunque eso obviamente afectará los valores clave). – hemp

+0

@hemp: después de volver a buscar más, creo que tienes razón. Extrañamente, su propia respuesta en la que cita de MSDN ('Hacer esto introduce un nuevo orden primario que ignora el orden previamente establecido') contradice lo que acaba de decir en este comentario. Pero creo que es MSDN que está mal. –

+0

No se contradice directamente, es simplemente confuso. Lo que está diciendo es que el nuevo orden primario no tendrá en cuenta el orden existente. ** Sin embargo **, una vez que aplica el orden inicial, si el nuevo pedido encuentra que los valores clave son iguales, no volverá a ordenar esos elementos. Entonces, de hecho, ambas declaraciones son verdaderas, pero no muy claras. – hemp

0

La respuesta a la thenby debería ser así

orderby 1, 2

Dejaré parte # 2 para otra persona.

8

la realización de una ThenBy en Query Expression Syntax es lisa y llana, simplemente siga el OrdenarPor inicial con una coma y una segunda afirmación:

// Create the data source. 
List<Student> students = GetStudents(); 

// Create the query. 
IEnumerable<Student> sortedStudents = 
    from student in students 
    orderby student.Last ascending, student.First ascending 
    select student; 

La aplicación de una segunda OrdenarPor utilizando los operadores de consulta estándar (métodos de extensión) abonará efectivamente el segundo orden por el resultado del resultado de la consulta que incluye el primer orden por. En efecto, solo se aplicará el segundo orden, aunque aún gastará tiempo de CPU calculando el primer pedido.

Esto se responde directamente en el MSDN documentation para los métodos Enumerable.OrderBy y Enumerable.ThenBy.

Debido IOrderedEnumerable hereda de IEnumerable, puede llamada OrdenarPor o OrderByDescending en los resultados de una llamada a OrdenarPor, OrderByDescending, ThenBy o ThenByDescending. Al hacer esto, introduce un nuevo orden primario que ignora el pedido previamente establecido .

7

El operador ThenBy aplica un orden ascendente y secundario a la secuencia. Es similar a la aplicación de un criterio de ordenación secundaria en T-SQL como:

Select * from Customer order by FirstName,lastName 

en LINQ podemos escribir esto como:

var thenby = mode.CustList.Select(cus => new 
     { 
      cus. FirstName, 
      cus. LastName, 
      cus. EmailAddress 
     }).OrderBy(cus => cus. FirstName).ThenBy(cus => cus. LastName); 

Usted puede comprobar más sobre esto aquí: http://dotnetreaders.com/articles/ThenBy_in_LINQ_c-sharp,_Orderby_Thenby_in_LINQ_C-sharp/204