Editer: Les deux réponses ci-dessous fonctionnent. Mon problème était dû à l'aide du fournisseur NHibernate LINQ comme ceci:Plusieurs requêtes LINQ "IN"
from parks in Session.Linq<Park>()
au lieu de comme ceci:
from parks in Session.Linq<Park().AsEnumerable()
J'ai une classe appelée parc qui a une des commodités. Je veux créer une requête LINQ qui retourne tous les objets Park qui contiennent chaque Amenity dans une liste. Donc, étant donné:
List<Park> Parks(IList<Amenity> amenities)
{
// I want a query that would look like this (if this worked)
// return all Park objects that have all of the given amenities
var query = from parks in db.Parks
where parks.Amenities.Contains(amenities)
select parks;
}
Cette requête:
var query = from parks in Session.Linq<Park>()
where amenities.All(a => parks.Amenities.Contains(a))
select parks;
ne fonctionne pas.
Voici plus de mon code pour le contexte:
classes de cartographie (I "m avec Fluent NHibernate)
public ParkDBMap()
{
Id(x => x.ParkId).Column("ParkId").GeneratedBy.HiLo("0").UnsavedValue(0);
Map(x => x.Name, "Name");
this.HasManyToMany<Amenity>(x => x.Amenities)
.Table("ParksMaps_ParkAmenities")
.Cascade.SaveUpdate();
}
public AmenityDBMap()
{
Id(x => x.AmenityId).Column("AmenityId").GeneratedBy.HiLo("0").UnsavedValue(0);
Map(x => x.Name, "Name");
}
Méthode d'essai:.
public void ListParksByAmenity()
{
// Create Parks
int parkCount = 10;
CreateParks(parkCount);
// Create Amenities
Amenity restrooms = new Amenity();
restrooms.Name = "Restrooms";
ParksRepos.SaveAmenity(restrooms);
Amenity tennis = new Amenity();
tennis.Name = "Tennis Courts";
ParksRepos.SaveAmenity(tennis);
Amenity dogs = new Amenity();
dogs.Name = "Dogs Allowed";
ParksRepos.SaveAmenity(dogs);
// Add amenities to parks
IList<Park> parks = ParksRepos.Parks();
parks[0].AddAmenity(dogs);
parks[0].AddAmenity(tennis);
parks[0].AddAmenity(restrooms);
ParksRepos.SavePark(parks[0]);
parks[4].AddAmenity(tennis);
parks[4].AddAmenity(restrooms);
ParksRepos.SavePark(parks[4]);
parks[9].AddAmenity(restrooms);
ParksRepos.SavePark(parks[4]);
IList<Amenity> amenityList = new List<Amenity>() { restrooms};
List<Park> restroomsParks = ParksRepos.Parks(amenityList);
// three parks have restrooms
Assert.AreEqual(1, restroomsParks.Count);
Assert.AreEqual(parks[0].Name, restroomsParks[0].Name);
amenityList = new List<Amenity>() { dogs, tennis, restrooms };
List<Park> allAmenities = ParksRepos.Parks(amenityList);
// only one park has all three amenities
Assert.AreEqual(3, allAmenities.Count);
}
J'ai trois tableaux A" Parks "table, une table" Amenities ", et une table many-to-many qui a deux colonnes, un ID de parc et un agrément ID
J'ai de la difficulté à envelopper ma tête. Quelqu'un a des suggestions?
Je pense que cela aurait fonctionné si je ne l'avais pas fait une faute de frappe dans ma question. La classe Park a une propriété List appelée Amenities, et non une propriété Amenity du même nom. Ma faute. – Jason
Cela fonctionne réellement lorsque je spécifie "Count()" au lieu de "Count" à la fin. Cela n'a fonctionné qu'après avoir modifié mon code. J'utilisais NHibernate et LINQ avait: des parcs à Session.Linq() si j'utilise: Liste AllParks = this.Parks() puis: des parcs dans tous les parcs. .. reste de la requête cela fonctionne. –
Jason
désolé, j'ai oublié les accolades. – Femaref