Thank's again!

I ended in using the query in my repository and quit searching for a better 
solution in my mapping - not only because I didn't found a solution but: 
Returning every descendant (not only the children) from a tree in a map can 
result in loading too much data into the applications memory. I think it's 
better to use a repository method for the developers to enforce some 
boundary.

Regards and an effective and efficient week to every reader and specially 
to Geoff!

Michael

Am Sonntag, 12. August 2012 07:01:41 UTC+2 schrieb Geoff:
>
>  No problems. The query I included in my original reply should do exactly 
> what you asked. You don't need to traverse the parent/child relationships 
> if you have the hierarchy path in a property of the object. 
>
> I'm assuming, based on your model, that all the OrgUnits are stored in one 
> table with self-referential links. By issuing the criteria query in my 
> email, it will return all of the OrgUnits in the hierarchy based on the 
> path, not the relationship, although this will mimic what you would get if 
> you wrote a recursive routine to walk the tree.
>
> As for the foreign key being added when you specify a has many, that 
> shouldn't matter. It's a natural way to ensure RI and that the NH 
> relationship will work. If you don't use it, it's cognitive cost to you is 
> zero. I'm not aware of a way to have a HasMany without one.
>
> My reasoning for mentioning the HasMany was just incase you wanted to 
> interrogate the children of any given OrgUnit directly. If you simply want 
> to build a visual tree structure, then you can just order by the path 
> hierarchy property as part of the criteria query, then loop over the result 
> set adding the respective children to their parent.
>
> Thanks,
> Geoff.
>
> On Saturday, 11 August 2012 at 2:02 AM, Michael Vogt wrote:
>
> Thank you a lot, Geoff!!
>
> OK, my missing link is:
>
> How is the criteria query applied to the HasMany call, There is no method 
> on HasMany where I can apply such a (criteria) query. Every usage of 
> HasMany I tried creates or uses a foreign-key-relationship in the 
> underlying tables and I do not need key-relationships in my case. I did not 
> find a goot documentation for HasMany until now.
>
> Meanwhile I have a solution that is fast enough implemented in my 
> repository (not in the map). The trick was not to use linq "join" but use 
>
>                 var linq = from ou in CurrentSession.Query<OrgUnit>()
>                            from ouDesc in CurrentSession.Query<OrgUnit>()
>                            where
>                            ouDesc.Id==ou.Id ||
> ouDesc.HierarchicalPath.StartsWith(ou.HierarchicalPath)
>                            select ouDesc;
>                
>
> Am Freitag, 10. August 2012 01:05:27 UTC+2 schrieb Geoff:
>
>  I might be not fulling understanding what you're asking here, but if what 
> you want to do is just retrieve all descendants based on some kind of 
> separated path, can't you just do that with an NHibernate criteria query? 
> Something like: 
>
> var descendants = Session.CreateCriteria<OrgUnit>()
> .Add(Restrictions.InsensitiveLike("HierarchicalPath", pathRootSegment, 
> MatchMode.BeginsWith)**
> .List<OrgUnit>();
>
> Assuming the path is something like: Parent/Child/Child/Child/Child etc, 
> then for the pathRootSegment = "Parent/Child" this would match:
> Parent/Child/
> Parent/Child/Child/
> Parent/Child/Child/Child/
> Parent/Child/Child/Child/Child
>
> Then you could just use a HasMany mapping on each OrgUnit if you wanted 
> to interrogate the direct children of any given unit.
>
> Again, sorry if I'm misunderstood the question.
>
> ** I'm not sure if that's the correct match mode, but there is a "begins 
> with" equivalent, and if your case is constant, then you can just use 
> Likeinstead of 
> InsensitiveLike.
>
> Thanks,
> Geoff.
>
> On Friday, 10 August 2012 at 5:46 AM, Michael Vogt wrote:
>
> Hello,
>
> I use fluent and nHibernate for about 2 months now but can not find the 
> right documentation for my problem:
>
> I habe a table "OrgUnits" wich represents a tree that can easy be queried. 
> I have the following columns:
>
> Id (Uniqueidentifier)
> Name (string)
> ParentOrgUnitId (uniqueidentifier)
> HierarchicalPath (string - the complete path is resolved using a 
> configured seperator)
>
> I want to avoid any recursion and have a query, based on the 
> HierarchicalPath column that can select all descendant org units (not only 
> the children). I need this recursion-less query to resolve some connected 
> ACL's (Access Control Lists).
>
> I think there is some solution to query for all descendants in linq, but: 
> How can I MAP this descendant org units. There is no Primary-Foreign Key 
> relationship to all descendants. It is easy to create an SQL to query for 
> all descendents (the select is cheap if you have an index in 
> "HierarchicalPath":
>
> I do not know if I can tell the fluent "HasMany" statement not to use any 
> primary-foreign-key relationship but instead give some "StartsWith" on the 
> HierarchicalPath column.
>
> Here is the SQL that collects all org units I want to be returned by the 
> "Descendants" mapping. This selects all descendant org units including 
> "MyRoot".
>
> Is it possible to do a mapping (self-mapping) that serves a 
> IEnumerable<OrgUnit> property with all org units defined in the SQL below 
> using Fluent?
>
> select d.* from OrgUnits o
> left join OrgUnits d on CharIndex(o.HierarchicalPath,d.HierarchicalPath)=1
> where o.Name='MyRoot'
>
>  -- 
> You received this message because you are subscribed to the Google Groups 
> "Fluent NHibernate" group.
> To view this discussion on the web visit 
> https://groups.google.com/d/msg/fluent-nhibernate/-/I5w4iWDx9sQJ.
> To post to this group, send email to fluent-n...@googlegroups.com.
> To unsubscribe from this group, send email to 
> fluent-nhibern...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/fluent-nhibernate?hl=en.
>  
>
>   -- 
> You received this message because you are subscribed to the Google Groups 
> "Fluent NHibernate" group.
> To view this discussion on the web visit 
> https://groups.google.com/d/msg/fluent-nhibernate/-/Nup2qPb2I-UJ.
> To post to this group, send email to fluent-n...@googlegroups.com<javascript:>
> .
> To unsubscribe from this group, send email to 
> fluent-nhibern...@googlegroups.com <javascript:>.
> For more options, visit this group at 
> http://groups.google.com/group/fluent-nhibernate?hl=en.
>  
>  
>  
Am Sonntag, 12. August 2012 07:01:41 UTC+2 schrieb Geoff:
>
>  No problems. The query I included in my original reply should do exactly 
> what you asked. You don't need to traverse the parent/child relationships 
> if you have the hierarchy path in a property of the object. 
>
> I'm assuming, based on your model, that all the OrgUnits are stored in one 
> table with self-referential links. By issuing the criteria query in my 
> email, it will return all of the OrgUnits in the hierarchy based on the 
> path, not the relationship, although this will mimic what you would get if 
> you wrote a recursive routine to walk the tree.
>
> As for the foreign key being added when you specify a has many, that 
> shouldn't matter. It's a natural way to ensure RI and that the NH 
> relationship will work. If you don't use it, it's cognitive cost to you is 
> zero. I'm not aware of a way to have a HasMany without one.
>
> My reasoning for mentioning the HasMany was just incase you wanted to 
> interrogate the children of any given OrgUnit directly. If you simply want 
> to build a visual tree structure, then you can just order by the path 
> hierarchy property as part of the criteria query, then loop over the result 
> set adding the respective children to their parent.
>
> Thanks,
> Geoff.
>
> On Saturday, 11 August 2012 at 2:02 AM, Michael Vogt wrote:
>
> Thank you a lot, Geoff!!
>
> OK, my missing link is:
>
> How is the criteria query applied to the HasMany call, There is no method 
> on HasMany where I can apply such a (criteria) query. Every usage of 
> HasMany I tried creates or uses a foreign-key-relationship in the 
> underlying tables and I do not need key-relationships in my case. I did not 
> find a goot documentation for HasMany until now.
>
> Meanwhile I have a solution that is fast enough implemented in my 
> repository (not in the map). The trick was not to use linq "join" but use 
>
>                 var linq = from ou in CurrentSession.Query<OrgUnit>()
>                            from ouDesc in CurrentSession.Query<OrgUnit>()
>                            where
>                            ouDesc.Id==ou.Id ||
> ouDesc.HierarchicalPath.StartsWith(ou.HierarchicalPath)
>                            select ouDesc;
>                
>
> Am Freitag, 10. August 2012 01:05:27 UTC+2 schrieb Geoff:
>
>  I might be not fulling understanding what you're asking here, but if what 
> you want to do is just retrieve all descendants based on some kind of 
> separated path, can't you just do that with an NHibernate criteria query? 
> Something like: 
>
> var descendants = Session.CreateCriteria<OrgUnit>()
> .Add(Restrictions.InsensitiveLike("HierarchicalPath", pathRootSegment, 
> MatchMode.BeginsWith)**
> .List<OrgUnit>();
>
> Assuming the path is something like: Parent/Child/Child/Child/Child etc, 
> then for the pathRootSegment = "Parent/Child" this would match:
> Parent/Child/
> Parent/Child/Child/
> Parent/Child/Child/Child/
> Parent/Child/Child/Child/Child
>
> Then you could just use a HasMany mapping on each OrgUnit if you wanted 
> to interrogate the direct children of any given unit.
>
> Again, sorry if I'm misunderstood the question.
>
> ** I'm not sure if that's the correct match mode, but there is a "begins 
> with" equivalent, and if your case is constant, then you can just use 
> Likeinstead of 
> InsensitiveLike.
>
> Thanks,
> Geoff.
>
> On Friday, 10 August 2012 at 5:46 AM, Michael Vogt wrote:
>
> Hello,
>
> I use fluent and nHibernate for about 2 months now but can not find the 
> right documentation for my problem:
>
> I habe a table "OrgUnits" wich represents a tree that can easy be queried. 
> I have the following columns:
>
> Id (Uniqueidentifier)
> Name (string)
> ParentOrgUnitId (uniqueidentifier)
> HierarchicalPath (string - the complete path is resolved using a 
> configured seperator)
>
> I want to avoid any recursion and have a query, based on the 
> HierarchicalPath column that can select all descendant org units (not only 
> the children). I need this recursion-less query to resolve some connected 
> ACL's (Access Control Lists).
>
> I think there is some solution to query for all descendants in linq, but: 
> How can I MAP this descendant org units. There is no Primary-Foreign Key 
> relationship to all descendants. It is easy to create an SQL to query for 
> all descendents (the select is cheap if you have an index in 
> "HierarchicalPath":
>
> I do not know if I can tell the fluent "HasMany" statement not to use any 
> primary-foreign-key relationship but instead give some "StartsWith" on the 
> HierarchicalPath column.
>
> Here is the SQL that collects all org units I want to be returned by the 
> "Descendants" mapping. This selects all descendant org units including 
> "MyRoot".
>
> Is it possible to do a mapping (self-mapping) that serves a 
> IEnumerable<OrgUnit> property with all org units defined in the SQL below 
> using Fluent?
>
> select d.* from OrgUnits o
> left join OrgUnits d on CharIndex(o.HierarchicalPath,d.HierarchicalPath)=1
> where o.Name='MyRoot'
>
>  -- 
> You received this message because you are subscribed to the Google Groups 
> "Fluent NHibernate" group.
> To view this discussion on the web visit 
> https://groups.google.com/d/msg/fluent-nhibernate/-/I5w4iWDx9sQJ.
> To post to this group, send email to fluent-n...@googlegroups.com.
> To unsubscribe from this group, send email to 
> fluent-nhibern...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/fluent-nhibernate?hl=en.
>  
>
>   -- 
> You received this message because you are subscribed to the Google Groups 
> "Fluent NHibernate" group.
> To view this discussion on the web visit 
> https://groups.google.com/d/msg/fluent-nhibernate/-/Nup2qPb2I-UJ.
> To post to this group, send email to fluent-n...@googlegroups.com<javascript:>
> .
> To unsubscribe from this group, send email to 
> fluent-nhibern...@googlegroups.com <javascript:>.
> For more options, visit this group at 
> http://groups.google.com/group/fluent-nhibernate?hl=en.
>  
>  
>  

-- 
You received this message because you are subscribed to the Google Groups 
"Fluent NHibernate" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/fluent-nhibernate/-/zTxbXhHy9wQJ.
To post to this group, send email to fluent-nhibernate@googlegroups.com.
To unsubscribe from this group, send email to 
fluent-nhibernate+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/fluent-nhibernate?hl=en.

Reply via email to