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.

Reply via email to