2

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.

Community
  • 1
  • 1
jero2rome
  • 1,548
  • 1
  • 21
  • 39

0 Answers0