ok, now i understand how it knows that all the payments of a receipt were
already fetched


On Tue, Aug 31, 2010 at 12:12 AM, Diego Mijelshon <[email protected]>wrote:

> The second would probably be something like:
>
>   session.CreateQuery("select r from Receipt r join fetch r.Payments where 
> r.id in (:ids)")
>
>          .SetParameterList("ids", ids).List(); // results discarded
>
>
> If you expect to have multiple initialized persistent collections on a
> paged list, the join overhead is a small price to pay.
> Of course, if this is going to end in a DTO, it's probably more performant
> to do the connections in memory.
>
>     Diego
>
>
> On Mon, Aug 30, 2010 at 16:29, nadav s <[email protected]> wrote:
>
>> you wrote for the second query:
>>
>> QueryForReceiptsFetchingPayments()
>>                       .FilteringByIdIn(ids)
>>                       .List()
>>
>>
>> did you mean something like this:
>>
>> select r.Payments
>> from Recipient r
>> where r.Id in (x1,x2,x3)
>>
>> if so i can understand how nhibernate does this, but won't it cause a join
>> in the query (if so it will be not the most efficient way to query for the
>> payments) although it will select only the payments' fields.
>>
>>
>>
>> sorry for all the questions, but i've stupidly did the work of connecting
>> everything via memory my self in many occasions
>>
>>
>> On Mon, Aug 30, 2010 at 10:25 PM, nadav s <[email protected]> wrote:
>>
>>> of course i understand how PK queries can resolve proxies without hitting
>>> the DB,
>>> but collections queries aren't the same.
>>>
>>> mother.Children
>>> when lazy loaded will result in the following query:
>>>
>>> from Children c
>>> where c.MotherId = X // the id of the father.
>>>
>>> now you're query does this:
>>>
>>> from Children c
>>> where c.MotherId in (x1,x2,x3,x4)
>>>
>>> i'm very impressed, yet still uncertain that nhibernate will know that it
>>> doesn't need to get the children of mother X
>>> after you're query if X is one of the x1...x4
>>>
>>> i always thought i have to connect the mothers (the first query) and the
>>> children (the second query) my self via memory.
>>>
>>> are you sure nhibernate does this for me?
>>>
>>> On Mon, Aug 30, 2010 at 10:13 PM, Diego Mijelshon <
>>> [email protected]> wrote:
>>>
>>>> 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]<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