Type de soutien aux membres dans les requêtes LINQ-to-Entités?

J'ai un MVC3 projet à l'aide du modèle d'Entity Framework dans lequel j'ai marqué d'une classe comme ceci:

public partial class Product
{
    public bool IsShipped
    {
        get { /* do stuff */ }
    }
}

et que je veux l'utiliser dans une expression LINQ:

db.Products.Where(x => x.IsShipped).Select(...);

cependant, j'obtiens l'erreur suivante:

Système.NotSupportedException a été gérée par le code de l'utilisateur Message=La
type spécifié membre 'IsShipped" n'est pas pris en charge dans LINQ to entities.
Seulement les initialiseurs, les membres de l'entité et l'entité propriétés de navigation
sont pris en charge. Source=Système.Les données.Entité

J'ai cherché sur google mais rien trouvé de définitif sur cette utilisation, j'ai essayé:

public partial class Product
{
    public bool IsShipped()
    {
        /* do stuff */
    }
}

db.Products.Where(x => x.IsShipped()).Select(...);

mais puis-je obtenir:

Système.NotSupportedException a été gérée par le code de l'utilisateur Message=LINQ
à des Entités qui ne reconnaît pas la méthode Boolean IsShipped () "méthode",
et cette méthode ne peut pas être traduit dans un magasin d'expression.
Source=Système.Les données.Entité

il y a une fonctionnalité que je ne veux pas construire dans la requête LINQ lui-même... ce qui est une bonne façon de gérer cela?

* mise à jour *

Darin fait le point valide que ce qui est fait dans la mise en œuvre de IsShipped aurait besoin d'être converti en une requête SQL et le compilateur n'a probablement pas savoir comment faire, donc la récupération de tous les objets en mémoire semble le seul choix (à moins qu'une requête directe à la base de données est faite). J'ai essayé comme ceci:

IEnumerable<Product> xp = db.Quizes
    .ToList()
    .Where(x => !x.IsShipped)
    .Select(x => x.Component.Product);

mais il génère cette erreur:

Une relation multiplicité de violation de contrainte produite: Une
EntityReference peut pas avoir plus d'un objet, mais l'
requête a retourné plus d'un objet connexe. C'est un non-récupérables
erreur.

bien que curieusement, cela fonctionne:

IEnumerable<Product> 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 affirmation ne fonctionne pas non plus...

* mise à jour III *

Je suis à la clôture de 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éplacer à ce nouveau post. La deuxième alternative, pour récupérer la totalité de la requête d'origine dans la mémoire, est probablement inacceptable, mais la troisième, de la mise en œuvre de la logique comme une question directe à la base de données, restent à explorer.

Merci à tous pour les précieux commentaires.

La "bonne façon de gérer cela" dépend entièrement de ce qu'est exactement "faire des trucs". La question est de savoir si il ya quelque chose qui peut être traduit en SQL ou pas. Si "faire des trucs" est: return MyMappedProp1 && MyMappedProp2 il y a un espoir (pas dans la façon dont vous le faire maintenant, mais dans un autre "à SEC" de façon sans doute). Si vous ouvrez un fichier sur le disque en "faire des trucs" et lire une valeur en dehors de ça, il n'y a probablement pas d'espoir. Tous les général solutions va vous forcer à la requête avec LINQ to Objects, c'est à dire de la charge tout en mémoire avant de filtrer.
non, je ne vais pas faire quelque chose mais les requêtes de base de données dans les "trucs"... cependant, voir ma récente mise à jour de cet affichage
Votre exception dans la "mise à jour": avez-vous ce également lorsque vous ne l'utilisez IEnumerable<Product> xp = db.Quizes.ToList(); ? Je crois que ce problème n'a rien à voir avec votre IsShipped de la propriété. Quelque chose d'autre qui est mauvais dans le modèle.
il a à voir avec Darin l'idée de chercher tout d'abord. J'ai utilisé un IEnumerable dans les tests, mais ce que je voulais, c'était une liste, donc considérer que List<Product> p1 = db.Quizes.Select(x => x.Component.Product).ToList(); fonctionne très bien mais List<Product> p1 = db.Quizes.ToList().Select(x => x.Component.Product).ToList(); produit d'exception. J'ai besoin de la finale .ToList() depuis que je suis de l'attribution d'une liste...

OriginalL'auteur ekkis | 2011-10-11