创建表达式树以将Guid或其他类型基元类型转换为字符串

时间:2015-10-01 09:00:05

标签: c# sql linq-to-entities expression-trees

使用Linq to Entities时,生成的查询应该在sql server上运行(不将其枚举到内存中然后执行转换)

我目前有一个project,我可以为字符串搜索构建表达式树。我目前正在探索将非字符串属性转换为字符串的可能性,以便能够搜索基本类型,例如integerGuid等。

我目前尝试将Convert提供的lamda属性添加到字符串中,然后使用以下内容将其交换到表达式树中:

var stringProperty = Expression.Convert(property.Body, typeof (string));
  

System.InvalidOperationException:类型'System.Int32'和'System.String'之间没有定义强制运算符。

我是否尝试实现不可能或有没有办法将linq扩展到实体以支持转换?

1 个答案:

答案 0 :(得分:0)

基本的想法是Expression.Convert将在MSIL中作为经典转换器发出,与此代码相似(假设您的属性类型为int):

int value = 80;
string result = (string)value;

此操作显然不受支持,因此在您的情况下也不会。备选方案:

我假设你已经有了一个变量,让我们调用类型为MemberExpression的变量“property”(以类似表达式的方式表示你的属性)。

1)尝试制作一个特殊的静态方法转换器(通用转换器):

public class UniversalConvertor {
     public static string Convert (object o) {
       return ... some convert logic ... :)
     }
} 

...

MethodInfo minfo = typeof (UniversalConvertor).GetMethod ("Convert", BindingFlags.Static | BindingFlags.Public);

var stringProperty = Expression.Call (null, minfo, property);

2)尝试调用“Convert.ToString”API:

MethodInfo minfo = typeof(Convert).GetMethod("ToString", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder, new Type[] { property.Type }, null);

var stringProperty = Expression.Call (null, minfo, property); // here we are calling the coresponding "Convert" method for the actually property type.

您可以组合使用这两种方法:对于Convert.ToString API已知的属性类型,您可以使用第二种方法。如果没有,您可以对您编写的更通用的方法进行回退。随意按照您的意愿实施。