> However, since there is no valid reason to make DelayedEnumerator public, i > would opt to return arrays instead of ienumerable instances > in your datacontracts, > and just do a .ToArray() when you're assembling your > CatalogsForSite object. Your DataContracts shouldn't > mention anything about an implementation detail of your persistence layer IMO.
That is exactly what I suggested - just from a higher level perspective. I never said "lazy loading", I said "lazy evaluation". Sorry that it obviously wasn't clear enough. Once you call ToArray() your whole resultset "materializes", no matter if there were still outstanding records not loaded yet. But the more important point is - as you said - that one never should expose implementation details. -Erich From: [email protected] [mailto:[email protected]] On Behalf Of Davy Brion Sent: Monday, July 27, 2009 12:34 AM To: [email protected] Subject: [nhusers] Re: Future<T> is not playing nice with web-services it's indeed not a lazy loading issue... the problem is that the DataContract has one or more properties that are defined as IEnumerable<T>, but the DataContractSerializer will choke on that if those references are actually instances of DelayedEnumerator<T>. If DelayedEnumerator were public, you could use the [KnownType] attribute on your IEnumerable properties to make sure the DataContractSerializer can deal with DelayedEnumerator types. However, since there is no valid reason to make DelayedEnumerator public, i would opt to return arrays instead of ienumerable instances in your datacontracts, and just do a .ToArray() when you're assembling your CatalogsForSite object. Your DataContracts shouldn't mention anything about an implementation detail of your persistence layer IMO. On Mon, Jul 27, 2009 at 12:15 AM, mhnyborg <[email protected]> wrote: I am not new to NH or the way lazy load works. I work in a group of 6 developers and we have been working since new year with NH over WCF and Silverlight as the UI. when I call var c = stypes.Any(); I can see from the unit test that NH is calling the databasen and that I have the corect data in all the DelayedEnumerator.result list. So it's not a lazy load problem. On Jul 26, 11:56 pm, "Erich Eichinger" <[email protected]> wrote: > how exactly do you expect a Future to work over a webservice with marshalling > in between? You should rethink your context boundaries - usually when > crossing an AppDomain boundary you should already have all data you need in > place and ready for marshalling them. Any form of lazy evaluation will hardly > work over the wire > > -Erich > > > > > -----Original Message----- > > From: [email protected] [mailto:[email protected]] On > > Behalf Of mhnyborg > > Sent: Sunday, July 26, 2009 11:41 PM > > To: nhusers > > Subject: [nhusers] Future<T> is not playing nice with web-services > > > First I love how easy it is to use Future<T> but I think it's only > > half baked. or put in another way only implemented for server side > > code that is not returning a list. > > > I have this code that's is returning a lot of simple catalogs for > > comboboxes > > > OperationContract] > > public CatalogsForSite GetCatalogsForSite() > > { > > CatalogsForSite catalogsForSite; > > using (var s = sessionManager.OpenSession()) > > { > > var stypes = s.CreateCriteria(typeof > > (ServitudeType)).Future<ServitudeType>(); > > var ptypes = s.CreateCriteria(typeof > > (ProtectionLineType)).Future<ProtectionLineType>(); > > var cSysTypes = s.CreateCriteria(typeof(CSys)).Future<CSys>(); > > var coordinatPrecissionTypes = s.CreateCriteria(typeof > > (CoordinatPrecissionType)).Future<CoordinatPrecissionType>(); > > var levelPrecissionTypes = s.CreateCriteria(typeof > > (LevelPrecissionType)).Future<LevelPrecissionType>(); > > var siteTypes = > > s.CreateCriteria(typeof(SiteType)).Future<SiteType> > > (); > > There is more .... > > > // this is done to make NH do the querys. DO this while the > > session > > is open > > var c = stypes.Any(); > > > catalogsForSite = new CatalogsForSite > > { > > StdNotes = stdNotes, > > SiteStatus = siteStatus, > > Phases = phases, > > ProbabilityTypes = probabilityTypes, > > SystemTypes = systemTypes, > > RevisionTypes = revisionTypes, > > EnvironmentClassifications = environmentClassifications, > > ProjectClassifications = projectClassifications, > > MilestoneHolidays = milestoneHolidays, > > There is more ... > > } > > > } > > > return catalogsForSite > > } > > > The problem is that Future<T> is returning > > NHibernate.Impl.DelayedEnumerator and that is not a type expected by > > the webservice. > > If the result on the DelayedEnumerator class was public then maybe I > > could use that. > > > Hope to get some help with this.- Hide quoted text - > > - Show quoted text - --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
