1

我想为看起来像这样的查询表达式创建一个表达式树:employee => employee.Salary.StartsWith("28")

这样 sql 就可以显示为: where (employee.salary like '28%')

问题是员工对象的属性 Salary 是小数,而 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 });
4

3 回答 3

1

您知道最简单的解决方案(可能也适用于 Linq to Sql)是:

employee => employee.Salary.ToString().StartsWith("28");
于 2010-09-09T07:26:13.527 回答
1

我已经设法使用功能映射解决了这个问题,这是 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")
于 2010-09-14T18:47:24.487 回答
0

如果 llblgen 不支持 ToString() 您可以通过创建执行转换的视图来解决该问题。你的目标数据库是什么?

如果是 SQL Server,您可以使用 CAST() 函数来创建视图。

例如

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

之后,您应该能够将该视图映射到一个新类并执行上述查询。

employee = employee.Salary.StartsWith("28");
于 2010-09-09T15:47:56.247 回答