使用Linq to Entities时,生成的查询应该在sql server上运行(不将其枚举到内存中然后执行转换)
我目前有一个project,我可以为字符串搜索构建表达式树。我目前正在探索将非字符串属性转换为字符串的可能性,以便能够搜索基本类型,例如integer
和Guid
等。
我目前尝试将Convert
提供的lamda属性添加到字符串中,然后使用以下内容将其交换到表达式树中:
var stringProperty = Expression.Convert(property.Body, typeof (string));
System.InvalidOperationException:类型'System.Int32'和'System.String'之间没有定义强制运算符。
我是否尝试实现不可能或有没有办法将linq扩展到实体以支持转换?
答案 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已知的属性类型,您可以使用第二种方法。如果没有,您可以对您编写的更通用的方法进行回退。随意按照您的意愿实施。