【问题标题】:Fluent Nhibernate - search for an item based on value of a many to many relationshipFluent Nhibernate - 根据多对多关系的值搜索项目
【发布时间】:2011-12-06 15:27:19
【问题描述】:

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

对于两个实体,品牌和附属公司以及它们之间的多对可能关系,我希望能够使用查询来查找品牌名称是变量值的附属公司。

这里是 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>();

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

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多