Obtenir la fonction de résultat dans LINQ sans traduire pour stocker l’expression

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.