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
Vous devez vous connecter pour publier un commentaire.
assez ironiquement, je l'ai résolu en quelques heures après que j'ai posté la question sur ici, après des jours de souffrance.
L'erreur est fondamentalement en disant: "je ne sais pas comment calculer ce que les articles ne sont pas inclus en comparant des objets fortement typés. Me donner une liste d'Entiers ou de certains types simples, et je peux prendre soin de lui".
Donc, vous devez d'abord obtenir une liste des clés primaires, puis l'utiliser dans la clause contains...
La première requête semble très bien, mais vous avez besoin de comparer les
Id
s:Je veux voir ce hasFacilities, de toute façon, comme L2E montre, "Seuls les types primitifs ('tels que Int32, String, et Guid") sont pris en charge dans ce contexte", donc je suppose que vous devez récupérer d'abord les données et les mettre dans une collection de FacilityViewItem.
espère que cela aide