I have a extension method for IQueryable for performing OrderByDescending which I took from Marc gravell's answer in stackoverflow.
public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string property)
I want NHibernate to use this method for performing queries on the database. For this I know we must do ILinqToHqlGenerator for the extension method. I have wrote the following, but I'm sure this is not correct. Can anyone tell me the correct solution for registering the extension method ?
public class OrderByDescendingRuntimeHqlGenerator : IRuntimeMethodHqlGenerator
{
private readonly IHqlGeneratorForMethod _orderByDescendingGenerator = new OrderByDescendingExtension();
#region Impementation of IRuntimeMethodHqlGenerator
public bool SupportsMethod(MethodInfo method)
{
return method != null && method.Name == "OrderByDescending";
}
public IHqlGeneratorForMethod GetMethodGenerator(MethodInfo method)
{
return _orderByDescendingGenerator;
}
#endregion Impementation of IRuntimeMethodHqlGenerator
}
public class OrderByDescendingExtension : BaseHqlGeneratorForMethod
{
public OrderByDescendingExtension()
{
SupportedMethods = new[] {ReflectionHelper.GetMethodDefinition(() => QueryableExtensionsEx.OrderByDescending<object>(null, null))};
}
public override HqlTreeNode BuildHql(MethodInfo method,
Expression targetObject,
ReadOnlyCollection<Expression> arguments,
HqlTreeBuilder treeBuilder,
IHqlExpressionVisitor visitor)
{
return treeBuilder.MethodCall("OrderByDescending", visitor.Visit(arguments[0]).AsExpression());
}
}
I get the following error : Could not parse expression 'value(NHibernate.Linq.NhQueryable``1[Measurement.Model.Test.TestPieceDto]).Where(t => ((t.ComponentId == 8f136b42-8838-42ba-aee1-a33800ad2896) AndAlso (t.ProductId == 22cb6d1f-1934-489a-b7d7-a33800ad285c))).OrderByDescending("CreationTime")': This overload of the method 'Common.Linq.QueryableExtensionsEx.OrderByDescending' is currently not supported.