private HqlTreeNode TranslateEqualityComparison(BinaryExpression expression) { var lhs = VisitExpression(expression.Left).ToArithmeticExpression(); var rhs = VisitExpression(expression.Right).ToArithmeticExpression(); // Check for nulls on left or right. if (VisitorUtil.IsNullConstant(expression.Right)) { rhs = null; } if (VisitorUtil.IsNullConstant(expression.Left)) { lhs = null; } if (lhs == null && rhs == null) { return(_hqlTreeBuilder.True()); } if (lhs == null) { return(_hqlTreeBuilder.IsNull(rhs)); } if (rhs == null) { return(_hqlTreeBuilder.IsNull((lhs))); } var lhsNullable = IsNullable(lhs); var rhsNullable = IsNullable(rhs); var equality = _hqlTreeBuilder.Equality(lhs, rhs); if (!lhsNullable || !rhsNullable) { return(equality); } var lhs2 = VisitExpression(expression.Left).ToArithmeticExpression(); var rhs2 = VisitExpression(expression.Right).ToArithmeticExpression(); return(_hqlTreeBuilder.BooleanOr( equality, _hqlTreeBuilder.BooleanAnd( _hqlTreeBuilder.IsNull(lhs2), _hqlTreeBuilder.IsNull(rhs2)))); }
protected override Expression VisitMethodCall(MethodCallExpression expression) { if (expression.Method.Name == nameof(LinqExtensionMethods.MappedAs) && expression.Method.DeclaringType == typeof(LinqExtensionMethods)) { var rawParameter = Visit(expression.Arguments[0]); var parameter = rawParameter as ConstantExpression; var type = expression.Arguments[1] as ConstantExpression; if (parameter == null) { throw new HibernateException( $"{nameof(LinqExtensionMethods.MappedAs)} must be called on an expression which can be evaluated as " + $"{nameof(ConstantExpression)}. It was call on {rawParameter?.GetType().Name ?? "null"} instead."); } if (type == null) { throw new HibernateException( $"{nameof(LinqExtensionMethods.MappedAs)} type must be supplied as {nameof(ConstantExpression)}. " + $"It was {expression.Arguments[1]?.GetType().Name ?? "null"} instead."); } _parameters[parameter].Type = (IType)type.Value; return(parameter); } var method = expression.Method.IsGenericMethod ? expression.Method.GetGenericMethodDefinition() : expression.Method; if (_pagingMethods.Contains(method) && !_sessionFactory.Dialect.SupportsVariableLimit) { //TODO: find a way to make this code cleaner var query = Visit(expression.Arguments[0]); var arg = expression.Arguments[1]; if (query == expression.Arguments[0]) { return(expression); } return(Expression.Call(null, expression.Method, query, arg)); } if (VisitorUtil.IsDynamicComponentDictionaryGetter(expression, _sessionFactory)) { return(expression); } return(base.VisitMethodCall(expression)); }
private HqlTreeNode TranslateInequalityComparison(BinaryExpression expression) { var lhs = VisitExpression(expression.Left).ToArithmeticExpression(); var rhs = VisitExpression(expression.Right).ToArithmeticExpression(); // Check for nulls on left or right. if (VisitorUtil.IsNullConstant(expression.Right)) { rhs = null; } if (VisitorUtil.IsNullConstant(expression.Left)) { lhs = null; } if (lhs == null && rhs == null) { return(_hqlTreeBuilder.False()); } if (lhs == null) { return(_hqlTreeBuilder.IsNotNull(rhs)); } if (rhs == null) { return(_hqlTreeBuilder.IsNotNull(lhs)); } var lhsNullable = IsNullable(lhs); var rhsNullable = IsNullable(rhs); var inequality = _hqlTreeBuilder.Inequality(lhs, rhs); if (!lhsNullable && !rhsNullable) { return(inequality); } var lhs2 = VisitExpression(expression.Left).ToArithmeticExpression(); var rhs2 = VisitExpression(expression.Right).ToArithmeticExpression(); HqlBooleanExpression booleanExpression; if (lhsNullable && rhsNullable) { booleanExpression = _hqlTreeBuilder.Inequality( _hqlTreeBuilder.IsNull(lhs2).ToArithmeticExpression(), _hqlTreeBuilder.IsNull(rhs2).ToArithmeticExpression()); } else if (lhsNullable) { booleanExpression = _hqlTreeBuilder.IsNull(lhs2); } else { booleanExpression = _hqlTreeBuilder.IsNull(rhs2); } return(_hqlTreeBuilder.BooleanOr(inequality, booleanExpression)); }