说实话,我有这三个类
class Bag { int Id; }
class Candy { int Id; }
class CandyBag
{
int Id;
Candy candy;
Bag bag;
}
我需要列出所有包含某种类型糖果的手袋,我认为它是这样的:
session.QueryOver<Bag>(() => bagAlias)
.JoinQueryOver<CandyBag>()
.Where(candyBag => candgyBag.Bag.Id == bagAlias.Id)
.And(candyBag => candgBag.Candy.Id == userSelectedCandy.Id)
.List();
问题是,我不能在Bag类中拥有CandyBag和Candy的属性,因为我有更多可以装袋的物品(如Cloth / ClotheBag Food / FoodBag)。我这样说是因为我做不到
session.QueryOver<Bag>(() => bagAlias)
.JoinQueryOver<CandyBag>(bag => bag.CandyBag, () => candyBagAlias)
.Where(candyBag => candyBag.Bag.Id == bagAlias.Id)
.List();
提前致谢。
答案 0 :(得分:0)
根据您的示例,我创建了这个类:
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; }
}
和这个NHibernate映射
<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>
获取某个Candy的Bag系列:
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;
我更喜欢LINQ方式,因为它很容易理解。