我使用流畅的nhibernate来加载POCO类。 我正在使用ClassMap派生来指定映射。 我正在使用这样的配置:
.Mappings(m => m.FluentMappings
.AddFromAssemblyOf<MyClass>()
.Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultLazy.Never())
/** I am using Never() because I have poco classes, not virtual properties **/
)
我希望发出一个查询,它将加载具有特定父ID的所有子实体,而不会填充父级 - 父级是大量。
查询
如何使用条件或其他映射或提示发出查询但不加载父对象,从而发出此查询。 我希望更好地控制加载的内容。 它不一定是linq提供者。
var results = _session.Query<Child>().Where(_ => _.Parent.Id == ?).ToList();
父母
public ParentMap()
{
Table("Parent");
Id(x => x.Id).Column("ParentId");
HasMany(x => x.Children)
.Table("Children")
.KeyColumn("ChildId").Inverse()
}
孩子
public ChildMap()
{
Table("Child");
Id(_ => _.Id).Column("ChildId");
References(_ => _.Parent).Column("PartyId").LazyLoad(Laziness.NoProxy);
}
答案 0 :(得分:2)
您可以只查询子实体:
var query = _session.QueryOver<Child>()
.Where(x=>x.Parent.Id==id)
.List();
或者要进行更精细的控制 - 使用投影和AliasToBean()变换器。类似的东西:
ChildDTO dto = null;
var query = _session.QueryOver<Child>()
.Where(x=>x.Parent.Id==id)
.SelectList(list=>list
.Select(x=>x.SomeProperty).WithAlias(()=>dto.SomeProperty)
.Select(x=>x.SomeOtherProperty).WithAlias(()=>dto.SomeOtherProperty))
.TransformUsing(Transformers.AliasToBean<ChildDTO>())
.List<ChildDTO>();
或
ChildDTO dto = null;
Child childAlias = null;
var query = _session.QueryOver<Parent>()
.JoinAlias(x=>x.Children, ()=>childAlias, JoinType.InnerJoin)
.Where(x=>x.Id==id)
.SelectList(list=>list
.Select(x=>childAlias.SomeProperty).WithAlias(()=>dto.SomeProperty)
.Select(x=>childAlias.SomeOtherProperty).WithAlias(()=>dto.SomeOtherProperty))
.TransformUsing(Transformers.AliasToBean<ChildDTO>())
.List<ChildDTO>();