IN et PAS IN avec Linq aux entités (EF4.0)

Cela a été ruiner ma vie pour quelques jours, le temps de se poser...

Je suis en utilisant Entity Framework 4.0 pour mon application.

Un Emplacement (par exemple une maison ou d'un bureau) a une ou plusieurs installations (comme une salle de bain, chambre à coucher, d'une table de billard, etc..)

Je veux afficher une liste de case à cocher dans la page emplacement, avec une liste de case à cocher dans les installations, avec ceux vérifié que l'emplacement a actuellement.

Mon point de Vue, le Modèle pour les installations qui va comme ceci...

public class FacilityViewItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Checked { get; set; }
}

Donc quand im passage de l'Emplacement du Modèle de Vue de l'INTERFACE utilisateur, je veux passer un List<T> des installations où T est de type FacilityViewItem.

Pour obtenir les installations que l'emplacement a déjà est simple - je faire une requête à l'aide de l'Emplacement.Les installations qui retourne un EntityCollection où T est du type d'Installation. C'est parce que des Installations est une propriété de navigation....

var facs = from f in location.Facilities
select new FacilityViewItem()
{
    Id = f.FacilityId,
    Name = f.Name,
    Checked = true
};

Donc c'est là que mon problème se situe - je veux le reste des installations, celles que l'Emplacement n'a pas.

J'ai essayé d'utiliser à l'Exception de() et() et (), mais j'obtiens la même erreur.

Des exemples de requêtes qui ne fonctionnent pas...

var restOfFacilities = from f in ctx.Facilities
    where !hasFacilities.Contains(f)
    select new FacilityViewItem()
        {
            Id = f.FacilityId,
            Name = f.Name
        };

var restOfFacilities = ctx.Facilities.Except(facilitiesThatLocationHas);

var notFacs = from e in ctx.Facilities
where !hasFacilities.Any(m => m.FacilityId == e.FacilityId)
    select new FacilityViewItem()
        {
            Id = e.FacilityId,
            Name = e.Name
        };

Et l'erreur que je reçois à chaque mise en œuvre...

Système.NotSupportedException était non gérée
Message=Impossible de créer une valeur constante de type 'Chapter2ConsoleApp.Installation'. Seuls les types primitifs ('tels que Int32, String, et Guid") sont pris en charge dans ce contexte.

Que suis-je surplombant ici?

source d'informationauteur Baldy | 2011-03-23