转换c#查询表达式的表达式树

时间:2010-09-08 19:17:15

标签: c# linq expression-trees

我在通过表达式树转换此查询时遇到问题:

WageConstIn => Convert.ToString(WageConstIn.Serialno).StartsWith("2800")

这是我的表达树:

var searchTextExp = LinqExpression.Constant("2800");
var parameterExp  = LinqExpression.Parameter(typeof(WageConstInEntity), "WageConstIn");
var propertyExp   = LinqExpression.Property(parameterExp, "Serialno");
var convertExpr   = LinqExpression.Parameter(typeof(Convert), "Convert");                   
var toStringExp   = LinqExpression.Call(convertExpr, "ToString", new[] { typeof(decimal) }, new[] { propertyExp });
var startsWithExp = LinqExpression.Call(toStringExp, "StartsWith", null, new[] { searchTextExp });

我收到以下错误:

  

“类型'System.Convert'上没有方法'ToString'与提供的参数兼容”

2 个答案:

答案 0 :(得分:1)

Convert.ToString Method (Decimal) 静态Convert Class  是一个静态类),没有任何泛型类型参数

使用Expression.Call Method (Type, String, Type[], Expression[])

  

通过调用相应的工厂方法,创建一个MethodCallExpression,表示对static(Visual Basic中的Shared)方法的调用。

示例:

var toString = Expression.Call(typeof(Convert), "ToString", null, propertyExp);

(另请注意,Convert.ToString不是通用的,因此您应为null参数提供typeArguments。)

答案 1 :(得分:0)

这是一个LLBLGEN问题,我使用FunctionMapping解决了它,如下所示:

public class FunctionMappings : FunctionMappingStore
   {
    public FunctionMappings()
        : base()
    {
        FunctionMapping mapping = new FunctionMapping(typeof(Functions), "Like", 2, "{0} LIKE {1}");
        this.Add(mapping);
    }
}

public class Functions
{
    public static bool Like(string field, string value)
    {
        return true;
    }

    public static bool Like(decimal field, string value)
    {
        return true;
    }
}

然后我继续调用创建linq表达式,如下所示:

ConstantExpression searchTextExp = Expression.Constant(string.Format("{0}%", searchText));
ParameterExpression parameterExp =    Expression.Parameter(typeof(ViewWageConstInEntity), "WageConstIn");
MemberExpression propertyExp = Expression.Property(parameterExp, searchField);
MethodCallExpression likeExpr = null;

if (propertyExp.Type == typeof(decimal))
{
    likeExpr = LinqExpression.Call(
        typeof(Functions).GetMethod("Like", new[] { typeof(decimal), typeof(string) }),
                    propertyExp, searchTextExp);
}
else if (propertyExp.Type == typeof(string))
{
    likeExpr = Expression.Call(
        typeof(Functions).GetMethod("Like", new[] { typeof(string), typeof(string) }),
                    propertyExp, searchTextExp);
}

这在db中生成了适当的SQL,如下所示:

WHERE ([Serialno] LIKE 'SearchText%')