Obtener la función de resultado en LINQ sin traducir a la expresión de la tienda

Necesito obtener el resultado de una función que necesita ejecutar en la consulta LINQ. Este resultado se une a la grilla, pero en el tiempo de ejecución encuentro este error:

LINQ to Entities no reconoce el método ‘System.String GetName (System.Type, System.Object)’, y este método no se puede traducir a una expresión de tienda.

Este es mi Código:

public IQueryable GetForRah_CapacityList(XQueryParam param) { var result = (from x in Data() select new { Rah_CapacityId = x.Rah_CapacityId, Rah_CapacityName = x.Rah_CapacityName, Rah_St = Enum.GetName(typeof(Domain.Enums.CapacityState), x.Rah_St), Rah_LinesId = x.Rah_LinesId }).OrderByDescending(o => new { o.Rah_CapacityId }); return result; } 

No puede usar este método en Linq-To-Entities porque LINQ no sabe cómo traducir Enum.GetName a sql. Así que ejecútelo en la memoria con Linq-To-Objects usando AsEnumerable y después de la consulta use AsQueryable para obtener el AsQueryable deseado:

Entonces o bien:

 var result = Data() .OrderBy(x=> x.CapacityId) .AsEnumerable() .Select(x => new { Rah_CapacityId = x.Rah_CapacityId, Rah_CapacityName = x.Rah_CapacityName, Rah_St = Enum.GetName(typeof(Domain.Enums.CapacityState), x.Rah_St), Rah_LinesId = x.Rah_LinesId }) .AsQueryable(); 

Primero debe usar OrderBy antes de usar AsEnumerable para beneficiarse del rendimiento de clasificación de la base de datos. Lo mismo se aplica a Where , siempre haz esto antes de AsEnumerable (o ToList ).

GetName no se pudo traducir a T-SQL, Linq a Entidades no pudo reconocerlo. Puede modificar el código de la siguiente manera:

  var result = (from x in Data().AsEnumerable() select new { Rah_CapacityId = x.Rah_CapacityId, Rah_CapacityName = x.Rah_CapacityName, Rah_St = Enum.GetName(typeof(Domain.Enums.CapacityState), x.Rah_St), Rah_LinesId = x.Rah_LinesId }).OrderByDescending(o => new { o.Rah_CapacityId }); 

Con .ToList() después de que se carguen los datos, cualquier operación adicional (como la selección) se realiza utilizando Linq to Objects, en los datos que ya están en la memoria.

EDITAR : También el tipo de devolución de su método es IQueryable mientras su consulta es IOrderedEnumerable de tipo anónimo , por lo que debe cambiar el tipo de método a System.Object o como una mejor solución crear una clase, enviar los valores a las propiedades de la clase y luego regresar eso.