Je dispose d'un projet MVC3 utilisant le modèle Entity Framework dans lequel j'ai marqué une classe comme ceci :
public partial class Product
{
public bool IsShipped
{
get { /* do stuff */ }
}
}
et que je veux utiliser dans une expression LINQ :
db.Products.Where(x => x.IsShipped).Select(...);
cependant, je reçois l'erreur suivante :
System.NotSupportedException a été interceptée par le code utilisateur Message=Le membre de type spécifié 'IsShipped' n'est pas pris en charge dans LINQ vers les entités. Seuls les initialiseurs, les membres d'entité et les propriétés de navigation d'entité sont pris en charge. Source=System.Data.Entity
J'ai cherché sur Google mais je n'ai rien trouvé de définitif sur cette utilisation donc j'ai essayé :
public partial class Product
{
public bool IsShipped()
{
/* do stuff */
}
}
db.Products.Where(x => x.IsShipped()).Select(...);
mais alors j'obtiens :
System.NotSupportedException a été interceptée par le code utilisateur Message=LINQ aux entités ne reconnaît pas la méthode 'Boolean IsShipped()' et cette méthode ne peut pas être traduite en une expression en mémoire.
Source=System.Data.Entity
il y a une fonctionnalité là que je ne veux pas intégrer dans la requête LINQ elle-même... quelle est une bonne façon de gérer cela ?
* mise à jour *
Darin fait valoir le point valide selon lequel tout ce qui est fait dans l'implémentation de IsShipped
devrait être converti en une requête SQL et le compilateur ne sait probablement pas comment le faire, c'est pourquoi récupérer tous les objets en mémoire semble être le seul choix (à moins qu'une requête directe à la base de données soit faite). J'ai essayé comme ceci :
IEnumerable xp = db.Quizes
.ToList()
.Where(x => !x.IsShipped)
.Select(x => x.Component.Product);
mais cela génère cette erreur :
Une violation de contrainte de multiplicité de relation s'est produite : Une EntityReference ne peut avoir qu'un seul objet associé, mais la requête a renvoyé plus d'un objet associé. Il s'agit d'une erreur irrécupérable.
bien que curieusement ceci fonctionne :
IEnumerable xp = db.Quizes
.ToList()
.Where(x => x.Skill.Id == 3)
.Select(x => x.Component.Product);
pourquoi cela ?
* mise à jour II *
désolé, cette dernière déclaration ne fonctionne pas non plus...
* mise à jour III *
Je clos cette question en faveur de la poursuite d'une solution comme suggéré ici pour aplatir ma logique dans une requête - la discussion se déplacera vers ce nouveau poste. La deuxième alternative, de récupérer l'intégralité de la requête initiale en mémoire, est probablement inacceptable, mais la troisième, implémenter la logique comme une requête directe à la base de données, reste à explorer.
Merci à tous pour vos précieuses contributions.