Linq表达式十进制包含方法

时间:2013-11-19 19:52:26

标签: c# linq linq-expressions

我有一个类,它基本上将网格过滤器转换为动态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是十进制数据类型

我尝试了其他一些方法,但看起来并不好,任何帮助都会非常感激。

1 个答案:

答案 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。