NHibernate JoinQueryOver在linkin属性中的另一个类

时间:2013-04-24 21:48:21

标签: nhibernate queryover

说实话,我有这三个类

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();  

提前致谢。

1 个答案:

答案 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方式,因为它很容易理解。