void IQueryVisitor.Visit(FilteringDescriptor filter) { // The member you want to evaluate (x => x.FirstName) Expression member = LinqExpressionHelper.GetMemberChainExpression(_param, filter.Field); // The value you want to evaluate Expression constant = Expression.Constant(filter.Criterion); if (filter.IgnoreCase && filter.Criterion is string) { member = Expression.Call(Expression.Coalesce(member, LinqProviderStatic.EmptyStr), LinqProviderStatic.ToUpper); constant = Expression.Constant(string.IsNullOrEmpty((string)filter.Criterion) ? string.Empty : (string)filter.Criterion); constant = Expression.Call(constant, LinqProviderStatic.ToUpper); } // Determine how we want to apply the expression switch (filter.Predicate) { case CriterionPredicate.Eq: case CriterionPredicate.Null: _expression = Expression.Equal(member, constant); break; case CriterionPredicate.Neq: case CriterionPredicate.NotNull: _expression = Expression.NotEqual(member, constant); break; case CriterionPredicate.Gt: _expression = Expression.GreaterThan(member, constant); break; case CriterionPredicate.GtEq: _expression = Expression.GreaterThanOrEqual(member, constant); break; case CriterionPredicate.Lt: _expression = Expression.LessThan(member, constant); break; case CriterionPredicate.LtEq: _expression = Expression.LessThanOrEqual(member, constant); break; case CriterionPredicate.Contains: //return Expression.AndAlso(Expression.NotEqual(member, Expression.Constant(null)), //Expression.Call(member, PaggedLinqBaseStatics.ContainsMethod, constant)); _expression = Expression.Call(Expression.Coalesce(member, LinqProviderStatic.EmptyStr), LinqProviderStatic.ContainsMethod, constant); break; case CriterionPredicate.StartsWith: _expression = Expression.Call(Expression.Coalesce(member, LinqProviderStatic.EmptyStr), LinqProviderStatic.StartsWithMethod, constant); break; case CriterionPredicate.EndsWith: _expression = Expression.Call(Expression.Coalesce(member, LinqProviderStatic.EmptyStr), LinqProviderStatic.EndsWithMethod, constant); break; } }
public QueryPaggedBase <TItem, TResult> AddFiltering(Expression <Func <TItem, object> > memberSelector, object criterion, CriterionPredicate predicate = CriterionPredicate.Eq, bool ignoreCase = false) { if (_filtering == null) { _filtering = new FilteringCollection(); } _filtering.Add(FilteringDescriptor.Get(memberSelector, criterion, predicate, ignoreCase)); return(this); }
void IQueryVisitor.Visit(FilteringDescriptor fd) { Tuple <string, bool> p = GetSqlPredicate(fd.Predicate); if (p.Item2) { _bld.AppendFormat("[{0}] {1} {2}", fd.Field, p.Item1, Quote(fd.Criterion, fd.Predicate)); } else { _bld.AppendFormat("[{0}] {1}", fd.Field, p.Item1); } }
public void TestLinqWIthConversion() { var f1 = new FilteringDescriptor() { Field = "f1", Predicate = CriterionPredicate.Gt, Criterion = "sss" }; var f2 = new FilteringDescriptor() { Field = "f1", Predicate = CriterionPredicate.Gt, Criterion = "sss" }; var f3 = new FilteringDescriptor() { Predicate = CriterionPredicate.Gt, Criterion = "sss" }; var f4 = new FilteringDescriptor() { Field = "f1", Predicate = CriterionPredicate.Gt }; var f5 = new FilteringDescriptor() { Field = "f1", Predicate = CriterionPredicate.Lt, Criterion = "sss" }; var f6 = new FilteringDescriptor() { Field = "f2", Predicate = CriterionPredicate.Gt, Criterion = "sss" }; var f7 = new FilteringDescriptor() { Field = "f1", Predicate = CriterionPredicate.Gt, Criterion = "sss2" }; Assert.IsTrue(f1 == f2); Assert.IsFalse(f1 == f3); Assert.IsFalse(f1 == f4); Assert.IsFalse(f1 == f5); Assert.IsFalse(f1 == f6); Assert.IsFalse(f1 == f7); Assert.IsFalse(f1 < f2); Assert.IsFalse(f1 < f3); Assert.IsFalse(f1 < f4); Assert.IsFalse(f1 < f5); Assert.IsTrue(f1 < f6); Assert.IsTrue(f1 < f7); }
void IQueryVisitor.Visit(FilteringDescriptor fd) { Tuple<string, bool> p = GetSqlPredicate(fd.Predicate); if (p.Item2) _bld.AppendFormat("[{0}] {1} {2}", fd.Field, p.Item1, Quote(fd.Criterion, fd.Predicate)); else _bld.AppendFormat("[{0}] {1}", fd.Field, p.Item1); }