예제 #1
0
        private static Expression GetExpression(ParameterExpression param, FilterDef filter)
        {
            MemberExpression member = Expression.Property(param, filter.Field);
            var converter           = TypeDescriptor.GetConverter(member.Type);

            if (!converter.IsValid(filter.Value))
            {
                return(null);
            }
            var propertyValue           = converter.ConvertFromInvariantString(filter.Value);
            ConstantExpression constant = Expression.Constant(propertyValue, member.Type);

            switch (filter.Operand)
            {
            case Operand.Equal:
#if NETFRAMEWORK
                if (member.Type == typeof(DateTime?) || member.Type == typeof(DateTime))
                {
                    var me = Expression.Convert(member, member.Type);
                    var ex = Expression.Call(null, typeof(DbFunctions).GetMethod("TruncateTime", new Type[] { member.Type }), me);
                    return(Expression.Equal(ex, constant));
                }
#endif
                return(Expression.Equal(member, constant));

            case Operand.NotEqual:
                return(Expression.NotEqual(member, constant));

            case Operand.GreaterThan:
                return(Expression.GreaterThan(member, constant));

            case Operand.GreaterThanOrEqual:
                return(Expression.GreaterThanOrEqual(member, constant));

            case Operand.LessThan:
                return(Expression.LessThan(member, constant));

            case Operand.LessThanOrEqual:
                return(Expression.LessThanOrEqual(member, constant));

            case Operand.Contains:
                return(Expression.Call(member, containsMethod, constant));

            case Operand.StartsWith:
                return(Expression.Call(member, startsWithMethod, constant));

            case Operand.EndsWith:
                return(Expression.Call(member, endsWithMethod, constant));

            default:
                return(null);
            }
        }
예제 #2
0
        public static Expression <Func <T, bool> > GetExpression <T>(FilterDef filter)
        {
            if (filter == null)
            {
                return(null);
            }

            ParameterExpression param = Expression.Parameter(typeof(T), "t");
            var exp = GetExpression(param, filter);

            if (exp == null)
            {
                return(null);
            }
            return(Expression.Lambda <Func <T, bool> >(exp, param));
        }