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.
