private LinqQueryExpression <TEntity> IsInCall <TEntity>(MethodCallExpression methodCallExpression, ExpressionConversionVisitor <TEntity> expressionConverter) where TEntity : class { var expression = expressionConverter.Visit(methodCallExpression.Arguments[1]) as LinqQueryExpression <TEntity>; var value = expressionConverter.Visit(methodCallExpression.Arguments[2]) as LinqQueryExpression <TEntity>; if (value.QueryExpression is ValueParameterQueryExpression valueQueryExpression && valueQueryExpression.Value is IEnumerable valueEnumerable) { var valueExpressions = new List <QueryExpression>(); foreach (var o in valueEnumerable) { valueExpressions.Add(ORMQueryExpressions.Value(o)); } return(new LinqQueryExpression <TEntity>( QueryExpression.IsIn( expression.QueryExpression, valueExpressions.ToArray() ), expression.JoinBuilders)); } return(new LinqQueryExpression <TEntity>( QueryExpression.IsIn( expression.QueryExpression, value.QueryExpression ), expression.JoinBuilders)); }
public bool TryConvertMethod <TEntity>(MethodCallExpression methodCallExpression, ExpressionConversionVisitor <TEntity> expressionConverter, out LinqQueryExpression <TEntity> convertedExpression) where TEntity : class { if (methodCallExpression.Method.IsGenericMethod) { var openGenericMethod = methodCallExpression.Method.GetGenericMethodDefinition(); if (_hasFlagMethod == openGenericMethod) { convertedExpression = HasFlagCall <TEntity>(methodCallExpression, expressionConverter); return(true); } else if (_isInMethods.Contains(openGenericMethod)) { convertedExpression = IsInCall <TEntity>(methodCallExpression, expressionConverter); return(true); } } else { if (methodCallExpression.Method == _lastInsertIdMethod) { convertedExpression = LastInsertIdCall <TEntity>(); return(true); } else if (methodCallExpression.Method == _randomMethod) { convertedExpression = RandomCall <TEntity>(); return(true); } if (methodCallExpression.Method == _isLikeMethod) { convertedExpression = IsLikeCall <TEntity>(methodCallExpression, expressionConverter); return(true); } else if (_minMethods.Contains(methodCallExpression.Method)) { convertedExpression = MinCall <TEntity>(methodCallExpression, expressionConverter); return(true); } else if (_maxMethods.Contains(methodCallExpression.Method)) { convertedExpression = MaxCall <TEntity>(methodCallExpression, expressionConverter); return(true); } else if (_countMethods.Contains(methodCallExpression.Method)) { convertedExpression = CountCall <TEntity>(methodCallExpression, expressionConverter); return(true); } } convertedExpression = default; return(false); }
private LinqQueryExpression <TEntity> MaxCall <TEntity>(MethodCallExpression methodCallExpression, ExpressionConversionVisitor <TEntity> expressionConverter) where TEntity : class { var expression = expressionConverter.Visit(methodCallExpression.Arguments[1]) as LinqQueryExpression <TEntity>; return(new LinqQueryExpression <TEntity>( QueryExpression.Max(expression.QueryExpression), expression.JoinBuilders )); }
private LinqQueryExpression <Flat_Entity> Convert(ExpressionConversionVisitor <Flat_Entity> converter, Expression <Func <Flat_Entity, bool> > expr) { var conditionConverter = new ConditionConverter <Flat_Entity>( converter.DataModel, converter.TableIdentifier ); var converted = conditionConverter.ConvertClause(expr); return(new LinqQueryExpression <Flat_Entity>( converted.QueryExpression, converted.Joins )); }
private LinqQueryExpression <TEntity> HasFlagCall <TEntity>(MethodCallExpression methodCallExpression, ExpressionConversionVisitor <TEntity> expressionConverter) where TEntity : class { var expression = expressionConverter.Visit(methodCallExpression.Arguments[1]) as LinqQueryExpression <TEntity>; var value = expressionConverter.Visit(methodCallExpression.Arguments[2]) as LinqQueryExpression <TEntity>; return(new LinqQueryExpression <TEntity>( QueryExpression.AreEqual( QueryExpression.And(expression.QueryExpression, value.QueryExpression), value.QueryExpression ), (expression.JoinBuilders ?? JoinBuilder <TEntity> .Empty).Concat( value.JoinBuilders ?? JoinBuilder <TEntity> .Empty ))); }
public bool TryConvertMethod <TEntity>(MethodCallExpression methodCallExpression, ExpressionConversionVisitor <TEntity> expressionConverter, out LinqQueryExpression <TEntity> convertedExpression) where TEntity : class { if (methodCallExpression.Method.Name != nameof(SqlServerFunctionsExtensions.ValueIsGreaterThanOne)) { convertedExpression = default; return(false); } var typedConverter = expressionConverter as ExpressionConversionVisitor <Flat_Entity>; convertedExpression = Convert(typedConverter, q => q.Value > 1) as LinqQueryExpression <TEntity>; return(true); }