我想使用动态LINQ查询来搜索类中所有属性中的一些文本.我正在使用以下函数来创建表达式.我正在将属性名称和搜索文本传递给方法.
在该方法中,如果属性类型是String,那么它工作正常.如果属性类型是int,DateTime,GUID.那它不起作用.
我们知道仅包含元素数组或字符串的方法.我认为属性的值应该输入到字符串.那怎么办呢?解释与解释是完整的帮助.
我收集了this的代码.
public static Expression<Func<T, bool>> ContainsExp<T>(string propertyName, string contains)
{
var parameterExp = Expression.Parameter(typeof(T), "type");
var propertyExp = Expression.Property(parameterExp, propertyName);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var someValue = Expression.Constant(contains, typeof(string));
var containsMethodExp = Expression.Call(propertyExp, method, someValue);
return Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp);
}
最佳答案 好吧,你可能知道在linq中对实体使用ToString()是不可能的.
所以以下问题是:如何将其他类型转换为字符串.
对于数值,你有SqlFunctions.StringConvert,但它只有double的重载?和十进制?
对于DateTime,你可以在你的DateTime上应用SqlFunctions.DatePart后找到一些使用SqlFunctions.StringConvert的东西(这可能意味着至少3次调用SqlFunctions.DatePart,年,月,日)
对于Guid,我认为没有办法直接做到这一点.一种方法(在db级别,如果你使用Sql Server)可能是一个Computed列.计算列可以存储GUID的varchar转换表示.也许有更好的方法.
无论如何,这里至少有一个样本应该适用于整数和字符串:
public static Expression<Func<T, bool>> ContainsExp<T>(string propertyName, string contains)
{
//first, get the type of your property
var propertyType = typeof(T).GetProperty(propertyName).PropertyType;
//no change
var parameterExp = Expression.Parameter(typeof (T), "type");
Expression propertyExp = Expression.Property(parameterExp, propertyName);
//if property's type is int
if (propertyType == typeof (int))
{
//convert your Expression to a nullable double (or nullable decimal),
//so that you can use SqlFunctions.StringConvert
propertyExp = Expression.Convert(propertyExp, typeof (double?));
//get the SqlFunctions.StringConvert method for nullable double
var stringConvertMethod = typeof (SqlFunctions).GetMethod("StringConvert", new[] {typeof (double?)});
//call StringConvert on your converted expression
propertyExp = Expression.Call(stringConvertMethod , propertyExp);
}
//no change
var method = typeof (string).GetMethod("Contains", new[] {typeof (string)});
var someValue = Expression.Constant(contains, typeof (string));
var containsMethodExp = Expression.Call(propertyExp, method, someValue);
return Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp);
}