Based on your example I've created this classes:
public class Bag {
public int Id {get; set;}
}
public class Candy {
public int Id { get; set; }
}
public class CandyBag
{
public int Id { get; set; }
public Candy Candy { get; set; }
public Bag Bag { get; set; }
}
and this NHibernate mappings
<class name="Bag" table="Bag" lazy="false" >
<id name="Id">
<generator class="identity" />
</id>
<!--<property name="CreationDate" />-->
</class>
<class name="Candy" table="Candy" lazy="false" >
<id name="Id">
<generator class="identity" />
</id>
<!--<property name="CreationDate" />-->
</class>
<class name="CandyBag" table="CandyBag" lazy="false" >
<id name="Id">
<generator class="identity" />
</id>
<many-to-one name="Candy" column="CandyId" lazy="false" />
<many-to-one name="Bag" column="BagId" lazy="false" />
</class>
To obtain Bag collection of a certain Candy:
IList<Bag> bags = null;
using (var session = OpenSession())
{
CandyBag candyBagAlias = null;
bags = session.QueryOver<CandyBag>(() => candyBagAlias)
.Where(() => candyBagAlias.Candy.Id == userSelectedCandyId )
.List()
.Select(cb => cb.Bag).ToList();
// or with LINQ
bags = (
from bag in session.Query<Bag>()
join candyBag in session.Query<CandyBag>() on bag equals candyBag.Bag
where candyBag.Candy.Id == userSelectedCandyId
select bag
).ToList();
}
return bags;
I prefer the LINQ way because it is really simple to understand.