How are you using it?
/Oskar 2015-06-24 13:10 GMT+01:00 PeSo <[email protected]>: > I think I understand now why the BitOrAggregate doesnot register. > > The method is an extension method. Its implementation: > > public static EnumRights BitOrAggregate(this IQueryable<AccessRight> > input, Expression<Func<AccessRight, EnumRights >> getter) > { > EnumRights defaultValue = EnumRights.unknown; > return input.Select(getter).Aggregate(defaultValue, (x, y) => > x | y); > } > > BitOrAggregate gets never added to the expression, instead a select gets > added and Aggregate (which isn't supported by Nhib SQL but gets executed in > C#). > > But how would I add/register such a grouping/sum function? > > > > > Am Freitag, 12. Juni 2015 14:53:22 UTC+2 schrieb PeSo: >> >> 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.
