Создайте дерево выражений для «лайка» в десятичном поле - PullRequest
1 голос
/ 09 сентября 2010

Я хотел бы создать дерево выражений для выражения запроса, которое выглядит примерно так: employee => employee.Salary.StartsWith ("28")

Чтобы sql мог выглядеть как: где (employee.salary вроде '28% ')

Проблема в том, что свойство Salary объекта employee является десятичным, а StartsWith не является свойством десятичного. Как я могу обойти это.

Мой синтаксис дерева ошибочных выражений следующий:

var searchTextExp = Expression.Constant("28");
var parameterExp = Expression.Parameter(typeof(EmployeeEntity), "employee");
var propertyExp = Expression.Property(parameterExp, "Salary");
var startsWithExp = Expression.Call(propertyExp, "StartsWith", null, 
   searchTextExp);
Expression<Func<EmployeeEntity, bool>> searchExpr = 
   Expression.Lambda<Func<EmployeeEntity, bool>>
     (startsWithExp, new ParameterExpression[] { parameterExp });

Ответы [ 3 ]

1 голос
/ 14 сентября 2010

Мне удалось решить эту проблему с помощью сопоставления функций, которое является функцией LLBLGEN Pro.

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

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

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

        this.Add(mapping);
    }
}

Затем я прикрепил экземпляр FunctionMappings к метаданным LINQ:

metadata.Mappings = new FunctionMappings();

Затем использовал функцию следующим образом:

employee => Functions.Like(employee.Salary,"28")
1 голос
/ 09 сентября 2010

Вы знаете, что самое простое решение (которое, вероятно, также будет работать в Linq to Sql):

employee => employee.Salary.ToString().StartsWith("28");
0 голосов
/ 09 сентября 2010

Если llblgen не поддерживает ToString (), вы можете обойти проблему, создав View, который выполняет приведение.Какова ваша целевая база данных?

Если это SQL Server, вы можете использовать функцию CAST () для создания представления.

например

  CREATE VIEW viewName as 
    SELECT CAST(Salary as varchar) as Salary
    FROM Employee

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

employee = employee.Salary.StartsWith("28");
...