2011-01-28 80 views
5

Estoy intentando seguir la demostración de este link para agregar un jqGrid a una aplicación MVC.No se pueden inferir los argumentos de tipo para el método System.Linq.Enumerable.OrderBy del uso

Tengo una tabla llamada Compañías que intento mostrar en una cuadrícula. Una compañía simplemente contiene una identificación y un nombre.

estoy corriendo en un error en mi función de controlador:

public JsonResult DynamicGridData(string sortIndex, string sortOrder, int page, int rows) 
{ 
    int pageIndex = Convert.ToInt32(page) - 1; 
    int pageSize = rows; 

    var companies = companiesRepository.Companies.OrderBy(sortIndex + " " + sortOrder).Skip(pageIndex * pageSize).Take(pageSize); 
    //Error here 

    ... 
} 

Recibo un error en la línea que está llamando OrdenarPor():

Los argumentos de tipo de método 'System.Linq.Enumerable.OrderBy (System.Collections.Generic.IEnumerable, System.Func)' no se puede deducir del uso. Intente especificar los argumentos de tipo explícitamente.

Realmente no tengo idea de lo que significa el error, y no he podido encontrar una explicación. No estoy seguro de qué está causando este error en una función simple OrderBy.

Respuesta

9

No puede OrderBy una cadena; necesitas pasar una expresión lambda o delegar.

Debe usar Dynamic LINQ, como se menciona en el tutorial.

+0

¿Tiene un ejemplo de cómo puedo hacer eso aquí? – Steven

+0

Simplemente necesita incluir la biblioteca y el espacio de nombres. – SLaks

+0

Estoy intentando usar Dynamic LINQ. El problema es que no conozco la propiedad que estoy ordenando. Lo estoy pasando como una cadena. ¿Cómo puedo convertir la cadena en una expresión lambda? – Steven

6

Si consultó la documentación del método que está llamando (Enumerable.OrderBy), sabría que el parámetro es Func<TSource, TKey> y no una cadena.

El tipo de argumentos para el método de 'System.Linq.Enumerable.OrderBy (System.Collections.Generic.IEnumerable, System.Func)' no pueden inferirse a partir del uso. Intente especificar los argumentos de tipo explícitamente.

El compilador intentó averiguar cómo el parámetro de cadena era en realidad un Func y luego decidió que no podía determinar qué es TSource y qué TKey es. Se le pide que ayude a cabo mediante la especificación de los tipos de la llamada, así:

companiesRepository.Companies.OrderBy<Company, int>(sortIndex + " " + sortOrder) 

Si lo hace, entonces el compilador lugar decirle que la cadena no es un parámetro correcto, porque ahora tiene suficiente información para saber eso.

+0

Eso no compilará tampoco. Se necesita un delegado, no una cadena. – SLaks

+3

Sí, eso es lo que dije. No estoy tratando de enseñarle cómo hacer lo que está intentando, solo estoy tratando de explicar lo que el compilador está diciendo. –

12

La respuesta específica a esta pregunta es lo que necesita para agregar

using System.Linq.Dynamic; 

y es necesario añadir una referencia a Dynamic.DLL en su proyecto.

3

Sé que este es un error de mi hijo, pero recibí el mismo error "CS0411 No se pueden deducir los usos del tipo de método 'Enumerable.OrderBy (IEnumerable, Func)' del uso. Intente especificar el escriba argumentos explícitamente ".

Resulta que la "propiedad" que estaba ordenando, en realidad era una función, y había omitido el "()". ¡Tardé AGES para encontrar!

En mi código exerpt:

return _numbers.Values.OrderBy(x => x.TotalScore); 

debería haber sido

return _numbers.Values.OrderBy(x => x.TotalScore()); 

sólo pensé que me gustaría mencionar que ......

1
  1. System.Linq.Dynamic.dll agregar la referencia a su proyecto.
  2. A continuación, añadir el espacio de nombres: using System.Linq.Dynamic;
+0

no existe en .net core o ef core. alguna alternativa? –

Cuestiones relacionadas