|
|
@ -71,10 +71,11 @@ public static class FilterExtensions |
|
|
|
{ |
|
|
|
var parameter = Expression.Parameter(typeof(T), "p"); //创建参数p
|
|
|
|
var member = Expression.PropertyOrField(parameter, filter.Column); //创建表达式中的属性或字段
|
|
|
|
// var propertyType = member.Type; //取属性类型,常量constant按此类型进行转换
|
|
|
|
//var constant = Expression.Constant(filterCondition.Value);//创建常数
|
|
|
|
|
|
|
|
ConstantExpression constant = null; |
|
|
|
//var propertyType = member.Type; //取属性类型,常量constant按此类型进行转换
|
|
|
|
//constant = Expression.Constant(filterCondition.Value);//创建常数
|
|
|
|
|
|
|
|
if (filter.Action != "In" && filter.Action != "NotIn") |
|
|
|
{ |
|
|
|
constant = CreateConstantExpression(member.Type, filter.Value); |
|
|
@ -140,14 +141,17 @@ public static class FilterExtensions |
|
|
|
/// <returns></returns>
|
|
|
|
private static ConstantExpression CreateConstantExpression(Type propertyType, string value) |
|
|
|
{ |
|
|
|
ConstantExpression constant; |
|
|
|
ConstantExpression constant = null; |
|
|
|
try |
|
|
|
{ |
|
|
|
if (propertyType.IsGenericType && |
|
|
|
propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) |
|
|
|
{ |
|
|
|
var objValue = Convert.ChangeType(value, propertyType.GetGenericArguments()[0], |
|
|
|
|
|
|
|
var objValue = Convert.ChangeType(ChangeTypeReturnValue(value, propertyType.GetGenericArguments()[0]), |
|
|
|
propertyType.GetGenericArguments()[0], |
|
|
|
CultureInfo.InvariantCulture); |
|
|
|
|
|
|
|
constant = Expression.Constant(objValue, propertyType); |
|
|
|
} |
|
|
|
else if (propertyType.IsEnum) |
|
|
@ -333,4 +337,34 @@ public static class FilterExtensions |
|
|
|
var inv = Expression.Invoke(condition, exp.Parameters); |
|
|
|
return Expression.Lambda<Func<T, bool>>(Expression.And(exp.Body, inv), exp.Parameters); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 转换传入的值,并将正确的值传出(解决 enum,guid)
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="value"></param>
|
|
|
|
/// <param name="type"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public static object ChangeTypeReturnValue(object value, Type type) |
|
|
|
{ |
|
|
|
if (value == null && type.IsGenericType) return Activator.CreateInstance(type); |
|
|
|
if (value == null) return null; |
|
|
|
if (type == value.GetType()) return value; |
|
|
|
if (type.IsEnum) |
|
|
|
{ |
|
|
|
if (value is string) |
|
|
|
return Enum.Parse(type, value as string); |
|
|
|
else |
|
|
|
return Enum.ToObject(type, value); |
|
|
|
} |
|
|
|
if (!type.IsInterface && type.IsGenericType) |
|
|
|
{ |
|
|
|
Type innerType = type.GetGenericArguments()[0]; |
|
|
|
object innerValue = ChangeTypeReturnValue(value, innerType); |
|
|
|
return Activator.CreateInstance(type, new object[] { innerValue }); |
|
|
|
} |
|
|
|
if (value is string && type == typeof(Guid)) return new Guid(value as string); |
|
|
|
if (value is string && type == typeof(Version)) return new Version(value as string); |
|
|
|
if (!(value is IConvertible)) return value; |
|
|
|
return Convert.ChangeType(value, type); |
|
|
|
} |
|
|
|
} |