es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

IQueryable orden compleja Solo se permiten campos en un $sort.

Quiero ordenar una lista. Cuando era IEnumerable, funcionaba bien, pero lo cambié a IQueryable para hacer consultas en MongoDB y ahora no funciona. Me está mostrando este error:

System.NotSupportedException: ‘Sólo se permiten campos en una $sort.’

//Consulta 1
var query = from d in list
orderby
d.Item.Valor1 + d.Item.Valor2 descending
select d;

//Consulta 2
var query = from d in list
orderby
FormulaRecomendacion(d) descending
select d;

private double FormulaRecomendacion(IItem d)
{
var calidad = ((int)(d.ValorX) / 18.0) * 50.0;
var reciente = ((DateTime.MinValue – (d.Item.Lanzamiento ?? DateTime.MinValue)).TotalDays / (DateTime.MinValue – new DateTime(1990, 1, 1)).TotalDays) * 30;
var calificacion = ((d.Item.CalificacionX + d.Item.CalificacionY) / 20) * 15;
var cantidad = (Cantidad(d) / 1000.0) * 5;
return calidad + calificacion + reciente + cantidad;
}

También entiendo que no admite funciones (como se muestra en la Consulta 2), pero la Consulta 1 también muestra el error cuando intento hacer ToList() de la lista. ¿Cómo puedo escribir este tipo de ordenación compleja para una lista IQueryable?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Cuando se utiliza IQueryable para consultar MongoDB, no se pueden usar expresiones o funciones complejas en la cláusula orderby. El mensaje de error que estás recibiendo indica que solo se pueden utilizar campos en una operación $sort.

    Para ordenar una lista IQueryable en MongoDB, necesitarás utilizar el método SortBy del controlador de MongoDb. Este método toma un campo como parámetro y se puede encadenar para ordenar por varios campos.

    Por ejemplo, puedes modificar la Consulta 1 para ordenar por un campo en lugar de una expresión compleja:

    var listaOrdenada = collection.AsQueryable()
        .OrderByDescending(d => d.Item.Valor1 + d.Item.Valor2)
        .ToList();
    

    En la Consulta 2, necesitarás calcular la fórmula de recomendación antes de consultar los datos. Luego, puedes ordenar por el campo calculado utilizando el método SortBy:

    var listaCalculada = lista.Select(d => new {
            Item = d,
            PuntuacionRecomendacion = FormulaRecomendacion(d.Item)
        });
    
    var listaOrdenada = listaCalculada.OrderBy(d => d.PuntuacionRecomendacion)
        .ToList();
    

    Ten en cuenta que este enfoque calcula la puntuación de recomendación para todos los elementos en la lista, lo cual puede no ser eficiente para conjuntos de datos grandes. Es posible que desees considerar calcular la puntuación de recomendación durante la inserción de datos o utilizar un proceso en segundo plano para calcular las puntuaciones y actualizarlas en la base de datos.

Comments are closed.