2011-07-27 55 views
3

背景:我需要創造這樣的擴展方法自定義爲linqtohiberante做以下,HQL表達等效的數據類型

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表達的參數列表。在上面的代碼片段中查看「卡在這裏」的文字。任何想法我怎麼能做到這一點。

在此先感謝

大黃蜂

回答

3

沒有嘗試,但我認爲你必須調用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()); 
    } 
+0

我不得不延長了一點以促進'%100%',除此之外,這是完美的! – Illuminati

+0

當我嘗試使用字節數組時,我得到'目前不支持類型爲Byte []'的元素:| – Sam