C# 为“创建表达式树”;例如;关于十进制字段

C# 为“创建表达式树”;例如;关于十进制字段,c#,lambda,llblgenpro,llblgen,C#,Lambda,Llblgenpro,Llblgen,我想为查询表达式创建一个表达式树,该表达式如下所示: employee=>employee.Salary.StartsWith(“28”) 因此,sql可以显示为: 其中(员工工资,如“28%”) 问题是employee对象的属性Salary是十进制的,而StartsWith不是十进制的属性。我怎样才能抽出时间来做这件事 我的错误表达式树语法如下: var searchTextExp = Expression.Constant("28"); var parameterExp = Expressi

我想为查询表达式创建一个表达式树,该表达式如下所示: employee=>employee.Salary.StartsWith(“28”)

因此,sql可以显示为: 其中(员工工资,如“28%”)

问题是employee对象的属性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 });
employee => Functions.Like(employee.Salary,"28")
var searchtextextexp=Expression.Constant(“28”);
var parameterExp=Expression.Parameter(typeof(EmployeeEntity),“employee”);
var propertyExp=Expression.Property(参数exp,“工资”);
var startsWithExp=Expression.Call(propertyExp,“StartsWith”,null,
searchTextExp);
表达式searchExpr=
Lambda
(startsWithExp,新参数expression[]{parameterExp});

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


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

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

e、 g

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

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

我已经设法使用函数映射解决了这个问题,这是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();
然后使用以下函数:

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 });
employee => Functions.Like(employee.Salary,"28")

嗯,我正在使用linq到llblgen,并且抛出了一个错误,因为“ToString”在解析时没有等效的转换。我已经尝试过了,并且:employee=>Convert.ToString(employee.Salary).StartsWith(“28”);这也不起作用。所以这可能更像是一个关于llblgen的问题。。。但是Linq表达式是正确的,我也认为这就是问题所在。我已经在llblgen论坛上记录了这个查询。它确实支持tostring(),但在db中,这是一个转换为char的过程,在这种情况下不起作用。视图是个不错的主意,但我对db的设计没有发言权。视图用于实现安全性,仅此而已。数据库是oracle10g@布马。当我使用ToString()时,我得到一个运行时错误,即对象没有ToString()属性。这是没有意义的,因为它有。虽然这不是由你来决定,但我建议用“观点”来解决问题。否则,您将不得不修改您正在使用的ORM-这将给您带来更多的努力。。。