private MemberExpression GetPropertyAccess(ParameterExpression arg) { string[] parts = QueryKey.Split('.'); MemberExpression property = Expression.Property(arg, parts[0]); for (int i = 1; i < parts.Length; i++) { property = Expression.Property(property, parts[i]); } return(property); }
private Expression <Func <T, bool> > CreatePredicateWithNullCheck <T>(Expression searchExpression, ParameterExpression arg, MemberExpression targetProperty) { string[] parts = QueryKey.Split('.'); Expression nullCheckExpression = null; if (parts.Length > 1) { MemberExpression property = Expression.Property(arg, parts[0]); nullCheckExpression = Expression.NotEqual(property, Expression.Constant(null)); for (int i = 1; i < parts.Length - 1; i++) { property = Expression.Property(property, parts[i]); Expression innerNullCheckExpression = Expression.NotEqual(property, Expression.Constant(null)); nullCheckExpression = Expression.AndAlso(nullCheckExpression, innerNullCheckExpression); } } if (!targetProperty.Type.IsValueType || (targetProperty.Type.IsGenericType && targetProperty.Type.GetGenericTypeDefinition() == typeof(Nullable <>))) { var innerNullCheckExpression = Expression.NotEqual(targetProperty, Expression.Constant(null)); if (nullCheckExpression == null) { nullCheckExpression = innerNullCheckExpression; } else { nullCheckExpression = Expression.AndAlso(nullCheckExpression, innerNullCheckExpression); } } if (nullCheckExpression == null || ValueFromQuery == null) { return(Expression.Lambda <Func <T, bool> >(searchExpression, arg)); } else { var combinedExpression = Expression.AndAlso(nullCheckExpression, searchExpression); var predicate = Expression.Lambda <Func <T, bool> >(combinedExpression, arg); return(predicate); } }