Yes, it does.

Let me explain this with a much simpler example:

  var animal = session.Get<Animal>(id);
  var mother = session.Get<Animal>(idOfTheMotherOfTheOtherAnimal)

After running those queries, animal.Mother is a fully initialized proxy.
Collections work pretty much the same.

The way Identity Map works is that not only you don't need to hit the DB
twice for the same POID; it also means the exact same object is returned.
The same is true for collections: Payment#1234.Receipts exists once and only
once in the session.

    Diego


On Mon, Aug 30, 2010 at 16:05, nadav s <[email protected]> wrote:

> sorry for the ignorance, but the session really knows that the second
> query's results contains the results of the lazy loading query that would of
> been created when accessing the collection?
>
> i thought it works for lazy loaded proxy, because that query is by the
> primary key, so if an object of the same type and the same PK was loaded by
> the same session (or in the second level cache) the proxy lazy loading
> doesn't need to hit the DB, but how does the session know that all of the
> one-to-many associated entities are already loaded?
>
> On Mon, Aug 30, 2010 at 6:04 PM, Diego Mijelshon 
> <[email protected]>wrote:
>
>> Yes.
>>
>>     Diego
>>
>>
>>
>> On Mon, Aug 30, 2010 at 11:40, Niclas Pehrsson <[email protected]>wrote:
>>
>>> Even if it is better to use DTO's, I want my receipts to have their
>>> list with payments and receipt entries.
>>> So in this solution each receipt will have their receiptentries and
>>> payments loaded, and reachable from receipt.Payments?
>>> On Aug 30, 3:43 pm, Diego Mijelshon <[email protected]> wrote:
>>> > Pseudocode:
>>> >
>>> > var receipts = LinqCriteriaSqlOrHqlQueryForReceiptsOnly()
>>> >                      .FilteringByIsNotSynchronizedAndIsClosed()
>>> >                      .InAnyOrderThatYouWant()
>>> >                      .SetMaxResults(200) // or .Take(200) for Linq
>>> >                      .List<Receipt>()
>>> > var ids = (from receipt in receipts select receipt.Id).ToList();
>>> > var irrelevant = QueryForReceiptsFetchingPayments()
>>> >                       .FilteringByIdIn(ids)
>>> >                       .List()
>>> > var irrelevantToo = QueryForReceiptsFetchingEntries()
>>> >                            .YouGetTheIdea()
>>> >                            .YouCanCombineTheseTwoQueriesWithFuture()
>>> >
>>> > Now, if you are going to use WFC, it's better to create DTOs,
>>> regardless of
>>> > how you do the queries.
>>> >
>>> >     Diego
>>> >
>>> > On Mon, Aug 30, 2010 at 05:48, Niclas Pehrsson <[email protected]>
>>> wrote:
>>> > > Well its a lot.
>>> >
>>> > > Receipt has two collections, receipt entries and payments.
>>> > > I want to load top 200 where the receipts is closed and not
>>> > > synchronized.
>>> > > The entities will be sent over wcf so lazyloading isn't anything to
>>> > > use it is best to load them all at the same time.
>>> > > We are using NHibernate 2.1 right now.
>>> >
>>> > > Receipt.IsSynchronized
>>> > > Receipt.IsClosed
>>> > > Receipt.Payments
>>> > > Receipt.Entries
>>> >
>>> > > How would I do this on the most efficient way?
>>> >
>>> > > On Aug 28, 12:55 pm, Diego Mijelshon <[email protected]> wrote:
>>> > > > ONE QUERY PER COLLECTION, not ONE QUERY PER COLLECTION PER RECORD.
>>> > > > If you have one filtered query with two collections, that's 3
>>> queries
>>> > > TOTAL,
>>> > > > regardless of the record count.
>>> >
>>> > > > Future allows you to reduce the roundtrips (the number of queries
>>> is
>>> > > still
>>> > > > the same), but you can't combine the first query and the others if
>>> you're
>>> > > > paging.
>>> > > > You can still use it for queries other than the first, which brings
>>> the
>>> > > > roundtrip count to 2 regardless of how many collections or records
>>> you
>>> > > are
>>> > > > loading.
>>> >
>>> > > >     Diego
>>> >
>>> > > > On Sat, Aug 28, 2010 at 04:55, Niclas Pehrsson <[email protected]
>>> >
>>> > > wrote:
>>> > > > > Well that means a lot of queries if MaxSize is 200.
>>> > > > > But maybe it is the only way to do it.
>>> >
>>> > > > > Are there any example of this scenario with Criterion?
>>> > > > > I guess the use of Future is needed, you want to get the root
>>> entity
>>> > > > > loaded with its collections as result.
>>> >
>>> > > > > On Aug 27, 8:08 pm, Diego Mijelshon <[email protected]>
>>> wrote:
>>> > > > > > The answer is right there: "two totally separate queries, first
>>> to
>>> > > get
>>> > > > > just
>>> > > > > > the entities, then to load the related associations"
>>> >
>>> > > > > > First, one paged query without fetching the collections, then
>>> one
>>> > > query
>>> > > > > per
>>> > > > > > collection, filtering with the Ids of the first query.
>>> >
>>> > > > > >     Diego
>>> >
>>> > > > > > On Fri, Aug 27, 2010 at 09:49, Niclas Pehrsson <
>>> [email protected]>
>>> > > > > wrote:
>>> > > > > > > Well it wont work :(
>>> >
>>> > > > > > > Ayende repsonded to an comment with this
>>> > > > > > > "SetMaxResults, but that might cause issues with the loading.
>>> > > > > > > At that point, I might want to execute two totally separate
>>> > > queries,
>>> > > > > > > first to get just the entities, then to load the related
>>> > > associations.
>>> > > > > > > "
>>> >
>>> > > > > > > So how can I solve this?
>>> > > > > > > Its a bit annoying, I want to load 200 hundred of thousands,
>>> and I
>>> > > > > > > want to avoid 200+200 select queries.
>>> > > > > > > Any other approaches?
>>> >
>>> > > > > > > On Aug 26, 3:03 pm, Diego Mijelshon <[email protected]>
>>> > > wrote:
>>> > > > > > > > SetMaxResults and SetFetchMode on _collections_ don't get
>>> along.
>>> >
>>> > > > > > > > Suggested read:
>>> >
>>> > >http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-asso
>>> .
>>> > > > > ..
>>> >
>>> > > > > > > >     Diego
>>> >
>>> > > > > > > > On Thu, Aug 26, 2010 at 04:50, Niclas Pehrsson <
>>> > > [email protected]>
>>> > > > > > > wrote:
>>> > > > > > > > > Hi I have an query that looks like this.
>>> >
>>> > > > > > > > >            Return (From receipt In _session.Linq(Of
>>> > > > > > > > > PointOfSale.Receipt)() _
>>> > > > > > > > >                            Where receipt.IsClosed AndAlso
>>> Not
>>> > > > > > > > > receipt.IsSynchronized _
>>> > > > > > > > >                     Select receipt).Take(25).ToList()
>>> >
>>> > > > > > > > > Or
>>> > > > > > > > >            Dim criterion = _session.CreateCriteria(Of
>>> Receipt)
>>> > > > > > > > > ().SetMazSize(25).Add(Expression.Eq("IsClosed", True)) _
>>> > > > > > > > >                .Add(Expression.Eq("IsSynchronized",
>>> False)) _
>>> > > > > > > > >                .SetFetchMode("Payments", FetchMode.Eager)
>>> _
>>> > > > > > > > >                .SetFetchMode("ReceiptEntry",
>>> FetchMode.Eager)
>>> >
>>> > > > > > > > >            'Return criterion.List(Of
>>> PointOfSale.Receipt)()
>>> >
>>> > > > > > > > > Both of them first asks the database för the first query
>>> > > options
>>> > > > > > > > > IsClosed and Not IsSynchronized, and then It creates an
>>> select
>>> > > N+1
>>> > > > > for
>>> > > > > > > > > each element. How can I do this better so it will be just
>>> one
>>> > > or
>>> > > > > three
>>> > > > > > > > > queries that selects top 25 entities?
>>> >
>>> > > > > > > > > --
>>> > > > > > > > > You received this message because you are subscribed to
>>> the
>>> > > Google
>>> > > > > > > Groups
>>> > > > > > > > > "nhusers" group.
>>> > > > > > > > > To post to this group, send email to
>>> [email protected].
>>> > > > > > > > > To unsubscribe from this group, send email to
>>> > > > > > > > > [email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> > > <nhusers%[email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> >
>>> > > > > <nhusers%[email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> > > <nhusers%[email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> >
>>> > > > > > > <nhusers%[email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> > > <nhusers%[email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> >
>>> > > > > <nhusers%[email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> > > <nhusers%[email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> >
>>> > > > > > > > > .
>>> > > > > > > > > For more options, visit this group at
>>> > > > > > > > >http://groups.google.com/group/nhusers?hl=en.
>>> >
>>> > > > > > > --
>>> > > > > > > You received this message because you are subscribed to the
>>> Google
>>> > > > > Groups
>>> > > > > > > "nhusers" group.
>>> > > > > > > To post to this group, send email to
>>> [email protected].
>>> > > > > > > To unsubscribe from this group, send email to
>>> > > > > > > [email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> > > <nhusers%[email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> >
>>> > > > > <nhusers%[email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> > > <nhusers%[email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> >
>>> > > > > > > .
>>> > > > > > > For more options, visit this group at
>>> > > > > > >http://groups.google.com/group/nhusers?hl=en.
>>> >
>>> > > > > --
>>> > > > > You received this message because you are subscribed to the
>>> Google
>>> > > Groups
>>> > > > > "nhusers" group.
>>> > > > > To post to this group, send email to [email protected].
>>> > > > > To unsubscribe from this group, send email to
>>> > > > > [email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> > > <nhusers%[email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> >
>>> > > > > .
>>> > > > > For more options, visit this group at
>>> > > > >http://groups.google.com/group/nhusers?hl=en.
>>> >
>>> > > --
>>> > > You received this message because you are subscribed to the Google
>>> Groups
>>> > > "nhusers" group.
>>> > > To post to this group, send email to [email protected].
>>> > > To unsubscribe from this group, send email to
>>> > > [email protected]<nhusers%[email protected]>
>>> <nhusers%[email protected]<nhusers%[email protected]>
>>> >
>>> > > .
>>> > > For more options, visit this group at
>>> > >http://groups.google.com/group/nhusers?hl=en.
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "nhusers" group.
>>> To post to this group, send email to [email protected].
>>> To unsubscribe from this group, send email to
>>> [email protected]<nhusers%[email protected]>
>>> .
>>> For more options, visit this group at
>>> http://groups.google.com/group/nhusers?hl=en.
>>>
>>>
>>  --
>> You received this message because you are subscribed to the Google Groups
>> "nhusers" group.
>> To post to this group, send email to [email protected].
>> To unsubscribe from this group, send email to
>> [email protected]<nhusers%[email protected]>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/nhusers?hl=en.
>>
>
>  --
> You received this message because you are subscribed to the Google Groups
> "nhusers" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<nhusers%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/nhusers?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to