0

我正在使用流利的 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);
}
4

1 回答 1

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>();
于 2012-05-24T14:28:16.657 回答