Эквивалент выражения HQL для типов данных - PullRequest
3 голосов
/ 27 июля 2011

Справочная информация: мне нужно создать специальный метод расширения для linqtohiberante, чтобы сделать следующее,

 result.Where(p => p.MyIntColumn.IsLike('%100%') );

, чтобы вывести пользовательский sql следующим образом.

select * from orders where  CONVERT(VARCHAR, MyIntColumn) LIKE '%100%'

И я пытаюсь создать собственное выражение для этого путем расширения BaseHqlGeneratorForMethod , как показано ниже.

    public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
            {
                return treeBuilder.Like(treeBuilder.MethodCall("convert", 
new[] { "stuck here",  visitor.Visit(arguments[0]).AsExpression() }),
                                        visitor.Visit(arguments[1]).AsExpression());
            }

Мне нужно иметь возможность вставить VARCHAR как выражение в список параметров выражения MethodCall. Посмотрите текст "застрял здесь" в приведенном выше фрагменте кода. Любая идея, как я могу это сделать.

Заранее спасибо

Шмель

1 Ответ

3 голосов
/ 27 июля 2011

Не пробовал, но я думаю, что вам нужно вызвать treeBuilder.Cast вместо treeBuilder.MethodCall

public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, 
        HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor) 
    {
        return treeBuilder.Like(
            treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof(string)),
            visitor.Visit(arguments[1]).AsExpression());
    }
...