流利的Nhibernate - 根据多对多关系的价值搜索项目

时间:2011-12-06 15:27:20

标签: nhibernate fluent-nhibernate

希望这个问题的标题是有道理的,如果没有,这是我的阐述。

有两个实体,Brand和Affiliate以及它们之间的多对多关系,我希望能够使用查询来查找BrandName是变量值的Affiliates。

这是Affiliate类和Affiliate MapClass(当然简化)

public class Affiliate
{
    public virtual int Id { get; private set; }
    public virtual DateTime DateReceived { get; set; }

    public virtual IList<Brand> Brands { get; set; }

    public Affiliate()
    {
        Brands = new List<Brand>();
    }
}

public class AffiliateApplicationRecordMap : ClassMap<Affiliate>
{
    public AffiliateApplicationRecordMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.DateReceived, "TimeStampCreated");

        HasManyToMany(x => x.Brands)
            .Cascade.All()
            .ParentKeyColumn("AffiliateID")
            .ChildKeyColumn("BrandID")
            .Table("AffiliateBrand");
    }
}

有一个名为AffiliateBrand的映射表,它提供了多对多的映射。

这是Brand类和ClassMap

public class Brand
{
    public virtual int ID { get; private set; }
    public virtual string Name { get; set; }

    public virtual IList<Affiliate> Affiliates{ get; set; }

    public Brand()
    {
        Affiliates = new List<Affiliate>();
    }

    public virtual void AddAffiliateApplication(Affiliate affiliate)
    {
        affiliate.Brands.Add(this);
        Brands.Add(affiliate);
    }
}

public class BrandMap : ClassMap<Brand>
{
    public BrandMap()
    {
        Id(x => x.ID).GeneratedBy.Identity();
        Map(x => x.Name);

        HasManyToMany(x => x.Affiliates)
            .Cascade.All()
            .Inverse()
            .ParentKeyColumn("BrandID")
            .ChildKeyColumn("PartnerID")
            .Table("AffiliateBrand");
    }
}

现在我想用NHibernate编写这个查询:

var result = session
                .CreateCriteria(typeof(Partner))
                .AddOrder(Order.Asc("DateReceived"))
                .Add(Restrictions.Eq("Brands.Name", brandName))
                .SetMaxResults(10)
                .List<Partner>();

现在显然这不起作用,我真的不认为它会。我想要做的就是让所有的会员回到品牌有特定名称的地方。我该如何撰写此查询?

1 个答案:

答案 0 :(得分:4)

您需要使用CreateAlias

为您的条件添加联接
var result = session
                .CreateCriteria(typeof(Partner))
                .AddOrder(Order.Asc("DateReceived"))
                .CreateAlias("Brands", "brand")
                .Add(Restrictions.Eq("brand.Name", brandName))
                .SetMaxResults(10)
                .List<Partner>();