0

I'm using NHibernate with fluent api and got MainEntity mapping like this:

mapping.References(c => c.Parent1).Not.Nullable().Fetch.Select();
mapping.HasMany(c => c.Children1).Fetch.Select();
mapping.HasMany(c => c.Children2).Fetch.Select();

Then I'm trying to query MainEntity like this:

var query = Session.Query<MainEntity>().Where(e => e.ID == id);
query.Fetch(e => e.Parent1).ToFuture();
query.FetchMany(e => e.Children1).ToFuture();
query.FetchMany(e => e.Children2).ThenFetch(c => c.Children21).ToFuture();
var entity = query.ToFuture().FirstOrDefault();

And got sql query like this:

select * from MainEntity
left outer join Parent1 on MainEntity.Parent1ID = Parent1.ID
where MainEntity.ID = @id;

select * from MainEntity
left outer join Children1 on MainEntity.ID = Children1.MainEntityID 
where MainEntity.ID = @id;

select * from MainEntity
left outer join Children2 on MainEntity.ID = Children2.MainEntityID
left outer join Children21 on Children2.Children21ID = Children21.ID
where MainEntity.ID = @id;

select * from MainEntity
where MainEntity.ID = @id;

But I want NHibernate to select MainEntity at first and then select Parent1 and Children1, Children2 by condition:

select *
from Parent1
where ID = @parent1ID;

select *
from Children1
where MainEntityID = @id;

@parent1ID and @id are selected by first query of MainEntities.

Please, help me to configure mapping to do this.

mike_grinin
  • 167
  • 1
  • 3
  • 13

1 Answers1

0

Have you tried other LINQ version ? It should look like this:

Query<Parent>()
.FetchMany(x=>x.Children1)
.FetchMany(x=>x.Children)
.FirstOrDefault(x=>x.Id=param1);

and change children mapping to

mapping.HasMany(c => c.Children1);
mapping.HasMany(c => c.Children2);
WholeLifeLearner
  • 455
  • 4
  • 19