Je dois obtenir le résultat d’une fonction qu’il faut exécuter dans une requête LINQ. Ce résultat est lié à la grid, mais au moment de l’exécution, l’erreur suivante apparaît:
LINQ to Entities ne reconnaît pas la méthode ‘System.Ssortingng GetName (System.Type, System.Object)’, et cette méthode ne peut pas être traduite en une expression de magasin.
Ceci est mon code:
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; }
Vous ne pouvez pas utiliser cette méthode dans Linq-To-Entities car LINQ ne sait pas Enum.GetName
en sql. Donc exécutez-le en mémoire avec Linq-To-Objects en utilisant AsEnumerable
et, après la requête, utilisez AsQueryable
pour obtenir le AsQueryable
souhaité:
Donc soit:
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();
Vous devez d’abord utiliser OrderBy
avant d’utiliser AsEnumerable
pour bénéficier des performances de sorting de la firebase database. La même chose s’applique à Where
, faites toujours cela avant AsEnumerable
(ou ToList
).
GetName
n’a pas pu être traduit en T-SQL, Linq en Entités n’a pas pu le reconnaître. Vous pouvez modifier le code comme ci-dessous:
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 });
Avec .ToList()
après le chargement des données, toute opération ultérieure (telle que la sélection) est effectuée à l’aide de Linq to Objects, sur les données déjà en mémoire.
EDIT : le type de retour de votre méthode est également IQueryable
alors que votre requête est IOrderedEnumerable
de type anonyme . Vous devez donc modifier le type de la méthode en System.Object
ou créer une classe de meilleure qualité, envoyer les valeurs dans les propriétés de la classe, puis renvoyer il.