C# 从所有表中获取数据,而不是从HQL查询中仅获取1个表的表中获取数据';s数据

C# 从所有表中获取数据,而不是从HQL查询中仅获取1个表的表中获取数据';s数据,c#,nhibernate,fluent-nhibernate,hql,C#,Nhibernate,Fluent Nhibernate,Hql,我在数据库中创建了3个表,并将数据放入其中。这3个表都有外键将它们连接在一起。下面是表类和映射。当我运行最后列出的查询时,我得到了对象的IList,它们拥有来自所有3个表的数据。但是,我的HQL查询仅来自最上面的表。我怎样才能从最上面的表格中得到结果 这些是我的课程: public class Technology { public virtual int Id { get; private set; } public virtual string Name { get; set

我在数据库中创建了3个表,并将数据放入其中。这3个表都有外键将它们连接在一起。下面是表类和映射。当我运行最后列出的查询时,我得到了对象的IList,它们拥有来自所有3个表的数据。但是,我的HQL查询仅来自最上面的表。我怎样才能从最上面的表格中得到结果

这些是我的课程:

public class Technology
{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual int SortOrder { get; set; }
    public virtual string Abbreviation { get; set; }
    public virtual IList<TechnologyDescription> TechnologyDescriptions { get; private set; }

    public Technology()
    {
        TechnologyDescriptions = new List<TechnologyDescription>();
    }

    public virtual void AddTechnologyDescription(TechnologyDescription technologyDescription)
    {
        technologyDescription.Technology = this;
        TechnologyDescriptions.Add(technologyDescription);
    }
}

public class TechnologyDescription
{
    public virtual int Id { get; private set; }
    public virtual Technology Technology { get; set; }
    public virtual string Description { get; set; }
    public virtual DescriptionType DescriptionType { get; set; }
}

public class DescriptionType
{
    public virtual int Id {get; private set;}
    public virtual string Type { get; set; }
}

These are my mapping objects:

public class TechnologyMap : ClassMap<Technology>
{
    public TechnologyMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.SortOrder);
        Map(x => x.Abbreviation);
        HasMany(x => x.TechnologyDescriptions)
                .Inverse()
                .Cascade.All();
    }
}

public class TechnologyDescriptionMap  : ClassMap<TechnologyDescription>
{
    public TechnologyDescriptionMap()
    {
        Id(x => x.Id);
        References(x => x.Technology);
        Map(x => x.Description);
        References(x => x.DescriptionType);
    }
}

public class DescriptionTypeMap : ClassMap<DescriptionType>
{
    public DescriptionTypeMap()
    {
        Id(x => x.Id);
        Map(x => x.Type);
    }
}

我不知道使用HQL是否可行,但使用NHibernate的Criteria API,您可以做到:

ICriteria criteria = session.CreateCriteria (typeof(Technology));

criteria.SetFetchMode ("TechnologyDescriptions", FetchMode.Lazy);

var list = criteria.List<Technology>();
完成此操作后,必须通知NHibernate该类的存在。 例如,可以通过在hbm.xml文件中导入类来实现。(我不知道如何使用Fluent)

使用标准:

ICriteria criteria = s.CreateCriteria (typeof(Technology));
criteria.SetResultTransformer (Transformers.AliasToBean (typeof(TechnologyView));
var result = criteria.List<TechnologyView>();
ICriteria标准=s.CreateCriteria(技术类型));
criteria.SetResultTransformer(Transformers.AliasToBean(typeof(TechnologyView));
var result=criteria.List();

我认为您需要的是延迟加载技术说明。这样,说明只有在被访问时才会从数据库中加载(NHibernate将发出第二个db查询。请注意,在某些情况下,这可能会导致N+1选择,您可能更喜欢一次性查询,具体取决于使用情况。)

By NHibernate xml映射默认为延迟加载集合。在过去,流畅的NHibernate似乎没有相同的默认值。您需要向映射添加
.LazyLoad()

最近,延迟加载似乎已成为默认的fluent映射:

这确实有帮助。有一件事我想澄清,也许这就是我迷路的地方。我不想在TechnologyDescription表中列出我的每项技术的所有数据的原因是,其中一些描述与我所在的页面不相关。但是,如果我理解正确,那么我希望通过我在技术实体中循环的方式删除/忽略这些结果。这确实让我感到奇怪,因为这意味着没有理由使用查询字符串,因为在这之后一切都会完成。我真的不太理解你的评论。如果你根本不需要页面上的描述,我会选择“不”转变的方法。谢谢你们。你们的回答帮助了我。谢谢!
public class TechnologyView
{
    public int Id
    {
        get;
        private set;
    }

    public string Name
    {
        get;
        private set;
    }

    public string Abbreviation
    {
        get;
        private set;
    }

    private TechnologyView()
    {
       // Private constructor, required for NH
    }

    public TechnologyView( int id, string name, string abbreviation )
    {
       this.Id = id;
       this.Name = name;
       this.Abbreviation = abbreviation;
    }
}
<import class="MyNamespace.TechnologyView" />
IQuery q = s.CreateQuery ("select new TechnologyView (t.Id, t.Name, t.Abbreviation) from Technology t");
ICriteria criteria = s.CreateCriteria (typeof(Technology));
criteria.SetResultTransformer (Transformers.AliasToBean (typeof(TechnologyView));
var result = criteria.List<TechnologyView>();