Yes that´s the most frustrating, you can get so close with a custom MethodCall is just a bit too limited it seems. If I just needed to call the methods MATCH() or AGAINST() separately there would be no problem. But as MySQL has designed these functions to work together I need a method call that is actually two methods as you can see I my code. I can´t see a reason for the HqlTreeBuilder being so strict, why not just be able to write the function signature in any format you liked? I have started to look at the nhibernate sourcecode bit it´s quite complicated to follow...
Den fredagen den 6:e juni 2014 kl. 14:38:16 UTC+2 skrev Gunnar Liljas: > > No, it's possible to create custom SQL with it as well, since you can > register custom functions. Not sure about this particular syntax though. > > /g > > On 5 jun 2014, at 20:54, Ricardo Peres <[email protected] <javascript:>> > wrote: > > AFAIK, this method only works for translating custom extensions into HQL. > Since HQL does not support MATCH...AGAINST, there's nothing you can do. > One possible alternative could possibly be writing a custom function in > MySQL that would wrap MATCH...AGAINST and calling it from LINQ. That is > possible. > > RP > > > On Thursday, June 5, 2014 8:41:49 AM UTC+1, Joel Hervén wrote: >> >> I´ve tried to write a LINQ extension that executes the MySQL function >> MATCH(...,...) AGAINST(...). But I have not been able to translate it into >> appropriate HQL because of the "two functions" syntax. >> >> To have something to look at I wrote this method >> >> public override HqlTreeNode BuildHql(MethodInfo method, Expression >> targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder >> treeBuilder, IHqlExpressionVisitor visitor) >> { >> var e1 = treeBuilder.MethodCall("MATCH", new[] >> { >> visitor.Visit(arguments[0]).AsExpression(), >> }); >> >> var e2 = treeBuilder.MethodCall("AGAINST", new[] >> { >> visitor.Visit(arguments[1]).AsExpression(), >> }); >> >> return >> treeBuilder.Equality(e1, e2); >> } >> >> The Equality method is obviously not the correct thing here but it will >> generate the SQL "MATCH(....)+AGAINST(....)" which is very close to correct >> except the + sign that shouldn´t be there. I have looked at the >> HqlTreeBuilder many times but I can´t find a working method to just add up >> the methods like needed here. >> >> So next thing was to look at the HqlTreeBuilder and try to extend with an >> alternative >> >> public class HqlDoubleMethod : HqlBooleanExpression >> { >> public HqlDoubleMethod(IASTFactory factory, HqlExpression lhs, >> HqlExpression rhs) >> : base(0, "", factory, lhs, rhs) >> { >> } >> } >> >> Calling this method instead of Equality results in a >> RewriteEmptyStreamException rule b >> >> >> Is it possible to implement this kind of function without modifying the >> Nhibernate-core? >> > -- > 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] <javascript:>. > To post to this group, send email to [email protected] <javascript:> > . > 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.
