Have you registered your ExtendedLinqToHqlGeneratorsRegistry?

/Oskar

2015-06-12 7:14 GMT+01:00 PeSo <[email protected]>:

> Hi,
> I am having problems mapping an BITORAGGREGATE SQl Function to
> Linq.NHibernate.
> I am using NH 4.0.3 and the  Oracle10Provider.
> The (simplified) domain model looks like this:
>
> public class Person {
>     public virtual int Id { get; set;}
>
>     public virtual string Name { get;set; }
> }
>
> public class AccessRight {
>     public virtual int Id { get; set;}
>
>     public virtual Person Person { get; set;}
>
>     public virtual EnumRights AssignedRights { get;set; }
> }
>
> EnumRights is a flags enum with Values Read,Write,Delete,...
>
> Basically I want to write a query that gives me all AccessRights that are
> assigned to a given person
> (Note that in the non simplified version rights can also be inherited from
> Usergroups that the user belongs to!).
> To be able to use this query as a filter I must compact the resultset of
> the subquery to a single EnumRights value
> by bit-oring all AssignedRights that my subquery returns.
>
> For that I have written the BitOrAggregate:
>
> SELECT BITORAGGREGATE(x.AccessRights) FROM AccessRight x where x.PersonId
> = 7
>
> which returns a single EnumRights value.
>
> But I am not able to successfully map this function.
>
> I wrote the C# Linq-Code:
>
>  public static EnumRights BitOrAggregate(this IQueryable<AccessRight>
> input, Expression<Func<AccessRight, EnumRights >> getter)
>         {
>             ...
>         }
>
> The BaseHqlgenerator:
>
> public class BitOrAggregateAccessRightFlags : BaseHqlGeneratorForMethod
>     {
>         public BitOrAggregateAccessRightFlags()
>         {
>             SupportedMethods = new[] {
>                 ReflectionHelper.GetMethod(() =>
> LinqExtension.BitOrAggregate(null,null))
>             };
>         }
>
>         public override HqlTreeNode BuildHql(MethodInfo method, Expression
> targetObject,
>             System.Collections.ObjectModel.ReadOnlyCollection<Expression>
> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
>         {
>             HqlExpression hqlExpression =
> visitor.Visit(arguments[1]).AsExpression();
>                 return treeBuilder.MethodCall("BITORAGGREGATE",
> hqlExpression);
>         }
>     }
>
> And I added the new generator to the linq registry.
>
> public class ExtendedLinqToHqlGeneratorsRegistry :
> DefaultLinqToHqlGeneratorsRegistry
>     {
>         public ExtendedLinqToHqlGeneratorsRegistry() : base()
>         {
>             RegisterGenerator(ReflectionHelper.GetMethod(() =>
> LinqExtension.BitOrAggregate(null,null)),
>                                 new BitOrAggregateAccessRightFlags());
>         }
>     }
>
> But it still enters the C# Linq implementation instead of emitting
> BITORAGGREGATE.
> I clearly must be doing something wrong.
> Any ideas/obvious mistakes?
> Thanks,
> Peter
>
>
>
>
>  --
> You received this message because you are subscribed to the Google Groups
> "nhusers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/nhusers.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.

Reply via email to