Résultats de linq cast à la liste

entity-framework linq linq-to-entities

Question

J'ai étendu mes entités pour implémenter des interfaces spécifiques pour ce type. J'essaie d'effectuer la requête suivante:

 var results = from x in context.MyEntityTable
               where x.AProperty == AValue
               select x;

 return results.Count() > 0 ? results.Cast<IApplicationEntity>().ToList() : null;

Cependant, je continue à avoir l'erreur suivante:

"LINQ to Entities ne prend en charge que le transtypage de types primitifs de modèle de données Entity"

En gros, ce que je veux faire, c'est toujours convertir les résultats du type d'entité brute en une liste générique de l'interface implémentée.

Est-ce possible?

Réponse acceptée

Vous pouvez effectuer la conversion sur le client en contournant la couche de traduction des requêtes de l'entité en appelant la méthode d'extension AsEnumerable :

return results.Any()
       ? results.AsEnumerable().Cast<IApplicationEntity>().ToList() 
       : null;

Cependant, il est préférable d'inverser l'ordre de faire le Count chèque:

var list = results.AsEnumerable().Cast<IApplicationEntity>().ToList();
return list.Count == 0 ? null : list;

Réponse populaire

Si vous souhaitez convertir vos résultats en un type complexe, vous devez forcer le code à utiliser LINQ to Objects plutôt que LINQ to Entities.

L'appel de la méthode d'extension AsEnumerable avant la AsEnumerable est l'astuce ici.

Essayez ce qui suit:

var results = from x in context.MyEntityTable
              where x.AProperty == AValue
              select x;

return results.AsEnumerable().Cast<IApplicationEntity>().ToList();

Notez également qu'il n'est pas sage de vérifier Count() sur l'énumérable, car cela signifie que la collection est itérée deux fois.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow