2010-06-20 10 views
5

Cómo hacer un pedido por variable de columna porque tengo un menú desplegable en la página y quiero mostrar la cuadrícula según el orden sord seleccionado en este menú desplegable, por ejemplo, precio, código, clasificación, descripción etc. etc. y no quiero escribir una consulta separada para cada columna.quiere una consulta para realizar un pedido por variable en la consulta de Linq

from lm in lDc.tbl_Products 
where lm.TypeRef == pTypeId 
orderby lm.Code ascending 
select new; 
+0

Ver también: http://stackoverflow.com/questions/41244/dynamic-linq-orderby –

Respuesta

6

Suponiendo que desea hacer la clasificación mediante SQL, deberá pasar la columna/tipo de clasificación. La consulta se aplaza hasta que realmente hace el selecto para que pueda acumularse la consulta en los pasos y una vez que haya terminado ejecutarlo así:

// Do you query first. This will NOT execute in SQL yet. 
var query = lDC.tbl_Products.Where(p => p.TypeRef == pTypeId); 

// Now add on the sort that you require... you could do ascending, descending, 
// different cols etc.. 
switch (sortColumn) 
{ 
    case "Price": 
     query = query.OrderBy(q => q.Price); 
     break; 
    case "Code": 
     query = query.OrderBy(q => q.Code); 
     break; 
    // etc... 
} 

// Now execute the query to get a result 
var result = query.ToList(); 

Si desea hacerlo fuera de SQL a continuación, acaba de obtener un básico resultado sin ordenar y luego aplicar un pedido por la base de resultados en los criterios de ordenación que necesita.

+0

y qué pasa si también tengo algún join en la consulta? – Azhar

+0

@Azhar acaba de agregar el 'Join' después del' Where' y todo lo demás debería funcionar igual. El 'Join' se unirá a otro' IQueryable'. – Kelsey

0

Puede "construir" una consulta LINQ en pasos separados.

Genere su consulta base para devolver la información sin clasificar. Esta consulta no se ejecutará hasta que intentes enumerar los resultados.

var data = from lm in lDc.tbl_Products 
      where lm.TypeRef == pTypeId 
      select new; 

Luego, en su controlador de eventos, aplique la clasificación que desee antes de vincular los resultados a la cuadrícula.

var orderedData = from lm in data 
        order lm.Code ascending 
        select new; 

// TODO: Display orderedData in a grid. 

La consulta completa que ha enumerado es la que se evaluará. Esto significa que puede ejecutar una consulta separada para cada elemento en su menú desplegable, creado a partir de una consulta "base".

+0

sí, pero en este tengo que escribir varias sentencias if ?? ¿Puedo declarar orderedData desde la declaración if – Azhar

3
public static IEnumerable<T> OrderByIf<T,TKey>(this IEnumerable<T> source, bool condition, Func<T, TKey> keySelector) 
    { 
     return (condition) ? source.OrderBy(keySelector).AsEnumerable() : source; 
    } 

Uso:

  var query = lDC.tbl_Products.Where(p => p.TypeRef == pTypeId) 
            .OrderByIf(sortColumn == "Price", p => p.Price) 
            .OrderByIf(sortColumn == "Code", p => p.Code);