我有一个类,它基本上将网格过滤器转换为动态linq表达式。网格包含一个简单的搜索,它从用户那里获取一个输入,我想创建一个可以用作通用搜索的包含语句。但是,我似乎无法找到一种方法来创建一个表达式,我可以采用十进制类型并创建一个包含(如)sql查询。
我尝试过的事情,但无济于事。
明确定义为字符串,我的意图是我可以使用typeof(string)
之外的'包含'方法。然而,它失败b / c它知道它的十进制类型而不是字符串。 Instance property 'Total' is not defined for type 'System.String'
var parm = Expression.Parameter(typeof(string), "param");
var exp = Expression.Property(parm, filter.PropertyName);
return Expression.Call(exp, containsMethod, constant);
创建我自己的十进制方法 ..看来这种心态是不可能的,因为LINQ没有办法从中生成查询。 LINQ只能使用已知的原生方法,听起来是否正确?
Expression callExpr = Expression.Call(
typeof (decimal), "Contains", new[] {member.Type}, constant, param);
public static bool Contains(this decimal obj, string value)
{
String _this = obj.ToString();
return _this.Contains(value);
}
最终它应该生成以下sql
where total like '%43%'
和total是十进制数据类型
我尝试了其他一些方法,但看起来并不好,任何帮助都会非常感激。
答案 0 :(得分:0)
我不确定你在那里做什么,但允许我为你翻译这些内容:
var parm = Expression.Parameter(typeof(string), "param");
var exp = Expression.Property(parm, filter.PropertyName);
return Expression.Call(exp, containsMethod, constant);
翻译成Linq会是这样的:
x => x.Name.Contains("something") // something is the constant and for example Name is coming from filter.PropertyName
上面的语句将抛出一个错误,因为x是string类型的参数,而string不具有Name属性。
你的第二个陈述也是错误的:
Expression callExpr = Expression.Call(
typeof (decimal), "Contains", new[] {member.Type}, constant, param);
public static bool Contains(this decimal obj, string value)
{
String _this = obj.ToString();
return _this.Contains(value);
}
翻译它看起来像这样:
Contains("something", x); // x is param and something is constant
认为“something”应为decimal类型,因为Contains的定义是第一个参数是decimal,第二个参数是string。
顺便说一句,如果您要查找十进制的字符串,可以使用Expression.Convert(..)。
在网上有很多关于Expression.Convert的例子,只要问google。