流利的nhibernate抑制加载参考

时间:2012-05-24 12:31:01

标签: c# wcf nhibernate poco lazy-loading

我使用流畅的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);
}

1 个答案:

答案 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>();