public override JoinExpression GetJoinExpression() { var rightIdentifier = AliasIdentifierExpression; var leftIdentifier = Left.AliasIdentifierExpression; var onCondition = default(QueryExpression); foreach (var columnPair in _joinColumnPairs) { var newCondition = QueryExpression.Compare( QueryExpression.Column(columnPair.LeftColumnName, leftIdentifier), ComparisonOperator.AreEqual, QueryExpression.Column(columnPair.RightColumnName, rightIdentifier) ); onCondition = QueryExpression.CombineConditions(onCondition, ConditionType.AndAlso, newCondition); } return(QueryExpression.Join( QueryExpression.Alias( Right.AliasIdentifierExpression, rightIdentifier.Identifier ), onCondition, JoinDirection.Left )); }
public virtual async Task Crud_Update() { using (var tempTable = await DataTestHelpers.CreateAutoIncrementTable(DataProvider)) using (var queryResult = await DataProvider.ExecuteReaderAsync( new CompositeQueryExpression( QueryExpression.Insert( tempTable.TableName, new[] { "Data" }, new object[] { 1 } ), QueryExpression.Update( QueryExpression.Table(tempTable.TableName), QueryExpression.Compare(QueryExpression.Column("Id"), ComparisonOperator.AreEqual, QueryExpression.Value(1)), QueryExpression.Assign(QueryExpression.Column("Data"), QueryExpression.Value(5)) ), QueryExpression.Select( new[] { QueryExpression.Column("Data") }, from: QueryExpression.Table(tempTable.TableName), where : QueryExpression.Compare(QueryExpression.Column("Id"), ComparisonOperator.AreEqual, QueryExpression.Value(1)) ) ))) { Assert.IsTrue(queryResult.HasRows); Assert.IsTrue(await queryResult.ReadAsync()); Assert.AreEqual(5, queryResult.GetInt32(0)); } }
public ExpressionResult Convert(MethodInfo methodInfo, MethodCallExpression node, ExpressionConverter expressionConverter) { var searchForExpression = expressionConverter.Convert(node.Arguments[0]); var searchInExpression = expressionConverter.Convert(node.Arguments[1]); if (searchInExpression.QueryExpression is ValueExpression valueExpression && valueExpression.Value is IEnumerable valueEnumerable) { var valueExpressions = new List <QueryExpression>(); foreach (var value in valueEnumerable) { valueExpressions.Add(ORMQueryExpressions.Value(value)); } return(new ExpressionResult( QueryExpression.Compare(searchForExpression.QueryExpression, ComparisonOperator.None, QueryExpression.InFunction(valueExpressions.ToArray())), MethodHelper.ConcatJoins(searchForExpression, searchInExpression).ToArray() )); } return(new ExpressionResult( QueryExpression.Compare(searchForExpression.QueryExpression, ComparisonOperator.None, QueryExpression.InFunction(searchInExpression.QueryExpression)), MethodHelper.ConcatJoins(searchForExpression, searchInExpression).ToArray() )); }
protected override void WriteFunctionToSql(QueryExpression queryExpression) { switch (queryExpression) { case ConcatenateQueryExpression concatenateQueryExpression: for (var i = 0; i < concatenateQueryExpression.Expressions.Length; i++) { ExpressionWriter.Visit(concatenateQueryExpression.Expressions[i]); if (i < concatenateQueryExpression.Expressions.Length - 1) { Sql.Append(" || "); } } return; case LastInsertIdFunctionExpression lastInsertIdExpression: Sql.Append("last_insert_rowid()"); return; case TableExistsVirtualFunctionExpression tableExistsExpression: ExpressionWriter.Visit( QueryExpression.Select( new[] { QueryExpression.Value(1) }, from: QueryExpression.Table("sqlite_master"), where : QueryExpression.AndAlso( QueryExpression.Compare(QueryExpression.Column("type"), ComparisonOperator.AreEqual, QueryExpression.Value("table")), QueryExpression.Compare(QueryExpression.Column("name"), ComparisonOperator.AreEqual, QueryExpression.Value(tableExistsExpression.Table.TableName)) ) ) ); return; } base.WriteFunctionToSql(queryExpression); }
public void OrElse(EntityField <T> schemaField, ComparisonOperator @operator, IQueryBuilder subQuery) { OrElse(QueryExpression.Compare( QueryExpression.Column(schemaField.Column.Name, schemaField.Source.AliasIdentifierExpression), @operator, subQuery.BuildQuery() )); AddJoin(schemaField.Source); }
public void OrElse(EntityField <T> schemaField, ComparisonOperator @operator, T entity) { OrElse(QueryExpression.Compare( QueryExpression.Column(schemaField.Column.Name, schemaField.Source.AliasIdentifierExpression), @operator, GetValueExpression(schemaField, entity) )); AddJoin(schemaField.Source); }
public void OrElse(EntityField <T> schemaField, ComparisonOperator @operator, Expression <Func <T, bool> > valueExpression) { var valueExpressionResult = ExpressionConverter.Convert(valueExpression); OrElse(QueryExpression.Compare( QueryExpression.Column(schemaField.Column.Name, schemaField.Source.AliasIdentifierExpression), @operator, valueExpressionResult.QueryExpression )); AddJoin(schemaField.Source); }
public void OrElse <TValue>(EntityField <T> schemaField, ComparisonOperator @operator, TValue value) { var valueExpression = ORMQueryExpressions.Value(value); OrElse(QueryExpression.Compare( QueryExpression.Column(schemaField.Column.Name, schemaField.Source.AliasIdentifierExpression), @operator, valueExpression )); AddJoin(schemaField.Source); }
public ExpressionResult Convert(MethodInfo methodInfo, MethodCallExpression node, ExpressionConverter expressionConverter) { var searchField = expressionConverter.Convert(node.Arguments[0]); var searchText = expressionConverter.Convert(node.Arguments[1]); return(new ExpressionResult( QueryExpression.Compare(searchField.QueryExpression, ComparisonOperator.Like, searchText.QueryExpression), MethodHelper.ConcatJoins(searchField, searchText).ToArray() )); }
public virtual async Task Select_WithWhere() { using (var tempTable = await Select_CreatePopulatedSelectTable()) using (var queryResult = await DataProvider.ExecuteReaderAsync( QueryExpression.Select( new[] { QueryExpression.All() }, from: QueryExpression.Table(tempTable.TableName), where : QueryExpression.Compare(QueryExpression.Column("Data"), ComparisonOperator.AreEqual, QueryExpression.Value(3)), limit: QueryExpression.Value(1) ))) { Assert.IsTrue(queryResult.HasRows); Assert.IsTrue(await queryResult.ReadAsync()); Assert.AreEqual(3, queryResult.GetInt32(1)); Assert.IsFalse(await queryResult.ReadAsync()); } }
public ExpressionResult Convert(MethodInfo methodInfo, MethodCallExpression node, ExpressionConverter expressionConverter) { if (node.Arguments.Count != 1) { throw new System.Exception("Incorrect number of arguments to HasFlag"); } var enumValueConvertExpression = node.Arguments[0] as UnaryExpression; var enumValueConstantExpression = enumValueConvertExpression.Operand; var convertedArgument = expressionConverter.Convert(enumValueConstantExpression); var calledOn = expressionConverter.Convert(node.Object); return(new ExpressionResult( QueryExpression.Compare( new BitwiseOperationQueryExpression(calledOn.QueryExpression, BitwiseOperator.And, convertedArgument.QueryExpression), ComparisonOperator.AreEqual, convertedArgument.QueryExpression), MethodHelper.ConcatJoins(convertedArgument, calledOn).ToArray() )); }
public virtual async Task Crud_Delete() { using (var tempTable = await DataTestHelpers.CreateAutoIncrementTable(DataProvider)) using (var queryResult = await DataProvider.ExecuteReaderAsync( QueryExpression.Transaction( QueryExpression.Insert( tempTable.TableName, new[] { "Data" }, new object[] { 1 } ), QueryExpression.Delete( QueryExpression.Table(tempTable.TableName), QueryExpression.Compare(QueryExpression.Column("Id"), ComparisonOperator.AreEqual, QueryExpression.Value(1)) ), QueryExpression.Select( new[] { QueryExpression.Column("Data") }, from: QueryExpression.Table(tempTable.TableName), where : QueryExpression.Compare(QueryExpression.Column("Id"), ComparisonOperator.AreEqual, QueryExpression.Value(1)) ) ))) { Assert.IsFalse(queryResult.HasRows); } }
protected override Expression VisitBinary(BinaryExpression node) { var leftExpression = ConvertToQueryExpression(node.Left); var rightExpression = ConvertToQueryExpression(node.Right); switch (node.NodeType) { case ExpressionType.AddChecked: case ExpressionType.Add: SetConversionResult( QueryExpression.Add(leftExpression, rightExpression) ); break; case ExpressionType.SubtractChecked: case ExpressionType.Subtract: SetConversionResult( QueryExpression.Subtract(leftExpression, rightExpression) ); break; case ExpressionType.MultiplyChecked: case ExpressionType.Multiply: SetConversionResult( QueryExpression.Multiply(leftExpression, rightExpression) ); break; case ExpressionType.Divide: SetConversionResult( QueryExpression.Divide(leftExpression, rightExpression) ); break; case ExpressionType.And: SetConversionResult( new BitwiseOperationQueryExpression(leftExpression, BitwiseOperator.And, rightExpression) ); break; case ExpressionType.ExclusiveOr: SetConversionResult( new BitwiseOperationQueryExpression(leftExpression, BitwiseOperator.ExclusiveOr, rightExpression) ); break; case ExpressionType.Or: SetConversionResult( new BitwiseOperationQueryExpression(leftExpression, BitwiseOperator.Or, rightExpression) ); break; case ExpressionType.AndAlso: SetConversionResult( QueryExpression.AndAlso(leftExpression, rightExpression) ); break; case ExpressionType.OrElse: SetConversionResult( QueryExpression.OrElse(leftExpression, rightExpression) ); break; case ExpressionType.Equal: SetConversionResult( QueryExpression.Compare(leftExpression, ComparisonOperator.AreEqual, rightExpression) ); break; case ExpressionType.NotEqual: SetConversionResult( QueryExpression.Compare(leftExpression, ComparisonOperator.AreNotEqual, rightExpression) ); break; case ExpressionType.GreaterThan: SetConversionResult( QueryExpression.Compare(leftExpression, ComparisonOperator.GreaterThan, rightExpression) ); break; case ExpressionType.GreaterThanOrEqual: SetConversionResult( QueryExpression.Compare(leftExpression, ComparisonOperator.GreaterThanOrEqualTo, rightExpression) ); break; case ExpressionType.LessThan: SetConversionResult( QueryExpression.Compare(leftExpression, ComparisonOperator.LessThan, rightExpression) ); break; case ExpressionType.LessThanOrEqual: SetConversionResult( QueryExpression.Compare(leftExpression, ComparisonOperator.LessThanOrEqualTo, rightExpression) ); break; default: throw new Exception($"Unsupported binary node type '{node.NodeType}'."); } return(node); }