Fluent Nhibernate-基于多对多关系的值搜索项目

Fluent Nhibernate-基于多对多关系的值搜索项目,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,希望这个问题的标题有意义,如果没有,下面是我的阐述 有了两个实体,品牌和分支机构,以及它们之间的多对多关系,我希望能够使用查询找到品牌名称为变量值的分支机构 这是附属类和附属映射类(当然是简化的) 公共类附属机构 { 公共虚拟整数Id{get;private set;} 公共虚拟日期时间DateReceived{get;set;} 公共虚拟IList品牌{get;set;} 公共附属机构() { 品牌=新列表(); } } 公共类AffiliateApplicationRecordMap:Cla

希望这个问题的标题有意义,如果没有,下面是我的阐述

有了两个实体,品牌和分支机构,以及它们之间的多对多关系,我希望能够使用查询找到品牌名称为变量值的分支机构

这是附属类和附属映射类(当然是简化的)

公共类附属机构
{
公共虚拟整数Id{get;private set;}
公共虚拟日期时间DateReceived{get;set;}
公共虚拟IList品牌{get;set;}
公共附属机构()
{
品牌=新列表();
}
}
公共类AffiliateApplicationRecordMap:ClassMap
{
公共附属应用程序RecordMap()
{
Id(x=>x.Id).GeneratedBy.Identity();
Map(x=>x.DateReceived,“TimeStampCreated”);
HasManyToMany(x=>x.Brands)
.Cascade.All()
.ParentKeyColumn(“附属ID”)
.ChildKeyColumn(“BrandID”)
.表格(“附属公司”);
}
}
有一个名为AffiliateBrand的映射表,它提供了多对多映射

这是品牌类别和类别地图

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");
    }
}
公共级品牌
{
公共虚拟整数ID{get;private set;}
公共虚拟字符串名称{get;set;}
公共虚拟IList附属机构{get;set;}
公共品牌()
{
附属公司=新列表();
}
公共虚拟无效AddAffiliateApplication(附属公司)
{
affiliate.Brands.Add(这个);
添加(附属公司);
}
}
公共类BrandMap:ClassMap
{
公共品牌地图()
{
Id(x=>x.Id).GeneratedBy.Identity();
Map(x=>x.Name);
HasManyToMany(x=>x.0)
.Cascade.All()
.Inverse()
.ParentKeyColumn(“BrandID”)
.ChildKeyColumn(“PartnerID”)
.表格(“附属公司”);
}
}
现在我正准备用NHibernate编写这个查询:

var result = session
                .CreateCriteria(typeof(Partner))
                .AddOrder(Order.Asc("DateReceived"))
                .Add(Restrictions.Eq("Brands.Name", brandName))
                .SetMaxResults(10)
                .List<Partner>();
var结果=会话
.CreateCriteria(类型(合作伙伴))
.AddOrder(Order.Asc(“DateReceived”))
.Add(Restrictions.Eq(“Brands.Name”,brandName))
.SetMaxResults(10)
.List();

现在很明显,这不起作用,我真的不认为它会起作用。我想做的是让所有的附属公司回到品牌有特定名称的地方。如何编写此查询?

您需要使用CreateAlias将联接添加到条件中

var result = session
                .CreateCriteria(typeof(Partner))
                .AddOrder(Order.Asc("DateReceived"))
                .CreateAlias("Brands", "brand")
                .Add(Restrictions.Eq("brand.Name", brandName))
                .SetMaxResults(10)
                .List<Partner>();
var结果=会话
.CreateCriteria(类型(合作伙伴))
.AddOrder(Order.Asc(“DateReceived”))
.CreateAlias(“品牌”、“品牌”)
.Add(Restrictions.Eq(“brand.Name”,brandName))
.SetMaxResults(10)
.List();

您需要使用CreateAlias将联接添加到您的条件中

var result = session
                .CreateCriteria(typeof(Partner))
                .AddOrder(Order.Asc("DateReceived"))
                .CreateAlias("Brands", "brand")
                .Add(Restrictions.Eq("brand.Name", brandName))
                .SetMaxResults(10)
                .List<Partner>();
var结果=会话
.CreateCriteria(类型(合作伙伴))
.AddOrder(Order.Asc(“DateReceived”))
.CreateAlias(“品牌”、“品牌”)
.Add(Restrictions.Eq(“brand.Name”,brandName))
.SetMaxResults(10)
.List();