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 に答える