2010-10-22 21 views
2

Je construis ma requête en utilisant PredicateBuilder depuis LinqKit. c'est génial et fait exactement ce que je cherche.Problèmes de moulage d'EntityFramework

Pour rendre mon code plus réutilisables (tables et vues) i créé une classe de constructeur générique prédicat:

public class LocalPredicateBuilder<T> where T : IResort 
... 
    var predicate = PredicateBuilder.True<T>(

qui expose la méthode BuildPredicate. Je peux l'utiliser comme ceci:

var predicate = new LocalPredicateBuilder<Resort>().BuildPredicate(); 
var resorts = _entities.Resorts.Where(predicate).ToList(); 

mais lorsque je tente de le faire, je reçois cette erreur d'exécution (BTW objets entité mise en œuvre IResort): Impossible de lancer le type « ConsoleApplication1.Entities.Resort » à tapez 'ConsoleApplication1.Entities.IResort'. LINQ to Entities ne prend en charge la coulée Entity Data Model types primitifs

j'ai essayé casting (ne fonctionne pas):

var rlist = eq.Cast<Resort>().ToList(); 

Toute autre façon que je peux contourner ce problème de casting?

MISE À JOUR

ne pas avoir beaucoup de chance d'obtenir des prédicats de travailler en utilisant des interfaces .. donc je solved my problem by going with POCOs.

Répondre

0

Eh bien, l'erreur est exacte. Vous ne pouvez pas le faire dans une requête L2E, car votre interface (IReport) ne fait pas partie de votre modèle d'entité et ne peut donc pas être convertie en SQL. Vous devez utiliser un type d'entité, pas une interface pour cela.

0

juste créer une classe partielle pour l'entité objet frameowrk et de faire qui implémentent l'interface.

autre moyen serait de créer une liste du type que vous voulez

puis faire un pour chacun sur l'ensemble de données LINQ et ajouter les éléments à la collection.

le problème est dû au fait que .net ne marche pas savoir comment lancer List<ISomething> dans un List<Something>

+0

j'ai. ne serait pas en mesure de compiler autrement –

+0

ok alors c'est le problème que j'ai ajouté après ma modification. –

+0

la requête renvoie effectivement la liste alors il devrait être possible de faire cette distribution. le quelque chose est seulement utilisé pour créer des prédicats utilisés dans où requête. –