LINQ Orderby Descending Query

439

Estoy seguro de que será relativamente simple.

Tengo una consulta LINQ que deseo ordenar por la fecha de creación más reciente.

Ver:

        var itemList = from t in ctn.Items
                        where !t.Items && t.DeliverySelection
                        orderby t.Delivery.SubmissionDate descending
                        select t;

También he intentado:

       var itemList = (from t in ctn.Items
                        where !t.Items && t.DeliverySelection
                        select t).OrderByDescending();

pero esto da un error:

Ninguna sobrecarga para el método 'OrderByDescending' toma 0 argumentos

Por lo que he leído, estoy bastante seguro de que la primera forma en que lo hice debería funcionar. He intentado cambiar de descendente a ascendente solo para ver si hace algo pero sigue igual.

Estaría agradecido si alguien pudiera echar un vistazo a la consulta y ver si estoy haciendo algo mal. Gracias :)

109221793
fuente

Respuestas:

674

Debe elegir una propiedad para ordenar y pasarla como una expresión lambda a OrderByDescending

me gusta:

.OrderByDescending(x => x.Delivery.SubmissionDate);

Realmente, aunque la primera versión de su declaración LINQ debería funcionar. ¿De t.Delivery.SubmissionDatehecho se rellena con fechas válidas?

Adam Price
fuente
2
Hola optus, gracias por tu respuesta. He descubierto cuál era el problema. Estaba usando una paginatedList, y en realidad estaba haciendo el pedido de esa clase auxiliar.
Marcaré
175

Creo que esto falló primero porque está ordenando un valor que es nulo. Si Delivery es una tabla asociada a una clave externa, debe incluir esta tabla primero, como se muestra a continuación:

var itemList = from t in ctn.Items.Include(x=>x.Delivery)
                    where !t.Items && t.DeliverySelection
                    orderby t.Delivery.SubmissionDate descending
                    select t;
mrosiak
fuente
incluir es equivalente a DataLoadOptions dlo = new DataLoadOptions (); dlo.LoadWith <Items> (i => i.Delivery); ctn.LoadOptions = dlo;
mrosiak
29

Creo que el segundo debería ser

var itemList = (from t in ctn.Items
                where !t.Items && t.DeliverySelection
                select t).OrderByDescending(c => c.Delivery.SubmissionDate);
Jonathan
fuente
Creo que para ser justos con él, escribí mal la consulta cuando publiqué (es decir, dejando en la segunda última línea de pedido) y probablemente solo copió y pegó para demostrar el uso de la orden Lambda OrderByDescending.
109221793
6

Solo para mostrarlo en un formato diferente que prefiero usar por alguna razón: la primera forma devuelve su itemList como System.Linq.IOrderedQueryable

using(var context = new ItemEntities())
{
    var itemList = context.Items.Where(x => !x.Items && x.DeliverySelection)
                                .OrderByDescending(x => x.Delivery.SubmissionDate);
}

Ese enfoque está bien, pero si lo quieres directamente en un objeto de lista:

var itemList = context.Items.Where(x => !x.Items && x.DeliverySelection)
                                .OrderByDescending(x => x.Delivery.SubmissionDate).ToList();

Todo lo que tiene que hacer es agregar una llamada .ToList () al final de la consulta.

Algo a tener en cuenta, no puedo recordar si la expresión! (Not) es aceptable en la llamada Where ().

nulltron
fuente