Преобразование дерева выражений для выражения запроса С#

У меня возникла проблема с преобразованием этого запроса через дерево выражений:

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 });

Я получаю следующую ошибку:

«Ни один метод ToString для типа System.Convert не совместим с предоставленными аргументами»


person Waliaula Makokha    schedule 08.09.2010    source источник
comment
Какой тип WageConstIn.Serialno?   -  person jjnguy    schedule 08.09.2010
comment
Это десятичное число, которое я пытаюсь преобразовать в строку с помощью метода System.Convert(десятичное значение).   -  person Waliaula Makokha    schedule 08.09.2010


Ответы (2)


Метод Convert.ToString (десятичный) является статическим< /strong> (Convert Class является статическим классом) и не имеет параметров универсального типа.

Используйте метод Expression.Call (Type, String, Type[], Expression[] ):

Создает MethodCallExpression, представляющий вызов метода static (Shared в Visual Basic) путем вызова соответствующего фабричного метода.

Пример:

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

(Также обратите внимание, что Convert.ToString не является универсальным, поэтому вы должны указать null для параметра typeArguments.)

person dtb    schedule 08.09.2010
comment
Кажется, это дает следующее выражение: ToString(WageConstIn.Serialno) вместо Convert.ToString(WageConstIn.Serialno) - person Waliaula Makokha; 08.09.2010
comment
@Waliaula Makokha: в выражениях вызова статического метода имя класса не отображается. - person dtb; 08.09.2010
comment
Если я вызову этот метод для свойства строки типа, например: ToString(WageConstIn.Text) и Text is s string, я получу следующую ошибку: более одного метода «ToString» для типа «System.Convert» совместимо с предоставленным аргументы. Как я могу это сделать? - person Waliaula Makokha; 09.09.2010
comment
@Waliaula Makokha: нет перегрузки Convert.ToString, которая принимает строку. И это не имело бы большого смысла - у вас уже есть строка :-) - person dtb; 09.09.2010

Это проблема 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;
    }
}

Затем я приступил к вызову выражения create the 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);
}

Это сгенерировало соответствующий SQL в БД следующим образом:

WHERE ([Serialno] LIKE 'SearchText%')
person Waliaula Makokha    schedule 10.09.2010