Estoy tratando de ordenar una lista de productos por su precio.
El conjunto de resultados debe enumerar los productos por precio de menor a mayor en la columna LowestPrice
. Sin embargo, esta columna es anulable.
Puedo ordenar la lista en orden descendente de la siguiente manera:
var products = from p in _context.Products
where p.ProductTypeId == 1
orderby p.LowestPrice.HasValue descending
orderby p.LowestPrice descending
select p;
// returns: 102, 101, 100, null, null
Sin embargo, no puedo entender cómo ordenar esto en orden ascendente.
// i'd like: 100, 101, 102, null, null
orderby p.LowestPrice ?? Int.MaxValue;
Es una manera simple.OrderByDescending, ThenBy
es más claro.orderby
, yRespuestas:
Intente poner ambas columnas en el mismo orden.
De lo contrario, cada pedido es una operación separada en la colección que lo reordena cada vez.
Esto debería ordenar los que tienen un valor primero, "luego" el orden del valor.
fuente
orderby p.LowestPrice == null, p.LowestPrice ascending
Hope ayuda a alguien.Realmente ayuda a comprender la sintaxis de consulta LINQ y cómo se traduce a las llamadas al método LINQ.
Resulta que
será traducido por el compilador a
Esto no es enfáticamente lo que quieres. Este tipo de
Product.LowestPrice.HasValue
endescending
orden y luego reordena toda la colecciónProduct.LowestPrice
endescending
orden.Lo que quieres es
que puede obtener utilizando la sintaxis de consulta por
Para obtener detalles de las traducciones de la sintaxis de consulta a las llamadas a métodos, consulte la especificación del idioma. Seriamente. Léelo
fuente
La solución para los valores de cadena es realmente extraña:
La única razón por la que funciona es porque la primera expresión
OrderBy()
, ordena losbool
valores:true
/false
.false
resultado vaya primero seguido por eltrue
resultado (nulables) yThenBy()
clasifique los valores no nulos alfabéticamente.Entonces, prefiero hacer algo más legible como este:
Si
SomeString
es nulo, será reemplazado por"z"
y luego ordenará todo alfabéticamente.NOTA: Esta no es una solución definitiva ya que
"z"
va primero que los valores z comozebra
.ACTUALIZACIÓN 9/6/2016 - Sobre el comentario de @jornhd, es realmente una buena solución, pero aún así es un poco complejo, por lo que recomendaré envolverlo en una clase de Extensión, como esta:
Y simple usarlo como:
fuente
Tengo otra opción en esta situación. Mi lista es objList, y tengo que ordenar pero los valores nulos deben estar al final. mi decisión:
fuente
Estaba tratando de encontrar una solución LINQ para esto, pero no pude encontrar las respuestas aquí.
Mi respuesta final fue:
fuente
mi decisión:
fuente
Esto es lo que se me ocurrió porque estoy usando métodos de extensión y también mi artículo es una cadena, por lo tanto no
.HasValue
:Esto funciona con objetos LINQ 2 en la memoria. No lo probé con EF ni con ningún DB ORM.
fuente
A continuación se muestra el método de extensión para verificar si es nulo si desea ordenar la propiedad secundaria de un keySelector.
Y simple usarlo como:
fuente
Aquí hay otra manera:
SUP_APPROVED_IND is char(1) in Oracle db.
Tenga en cuenta que
r.SUP_APPROVED_IND.Trim() == null
se trata comotrim(SUP_APPROVED_IND) is null
en Oracle db.Vea esto para más detalles: ¿Cómo puedo consultar valores nulos en el marco de la entidad?
fuente
Otra opción (fue útil para nuestro escenario):
Tenemos una tabla de usuario, almacenando
ADName, LastName, FirstName
Modificamos el esquema de la tabla y agregamos una columna "SortIndex", que define algunos grupos de clasificación. (Dejamos un espacio de 5, para que podamos insertar grupos más tarde)
Ahora, en cuanto a consultas, sería:
en Expresiones de métodos:
que produce el resultado esperado:
fuente