C# 从所有表中获取数据,而不是从HQL查询中仅获取1个表的表中获取数据';s数据
我在数据库中创建了3个表,并将数据放入其中。这3个表都有外键将它们连接在一起。下面是表类和映射。当我运行最后列出的查询时,我得到了对象的IList,它们拥有来自所有3个表的数据。但是,我的HQL查询仅来自最上面的表。我怎样才能从最上面的表格中得到结果 这些是我的课程: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
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>();