public void WriteUnion_WhenSelectWithWhere_WritesUnionStatement() { StringBuilder builder = new StringBuilder(); using (SqlWriter writer = new SqlWriter(builder)) { writer.WriteStartSelect(); writer.WriteColumn("u", "Id", null); writer.WriteColumn("u", "Name", null); writer.WriteStartFrom(); writer.WriteTable("Users", "u"); writer.WriteStartWhere(); writer.WriteColumn("u", "Age", null); writer.WriteOperator(SqlBinaryOperator.LessThanOrEqual); writer.WriteValue(18); writer.WriteEndSelect(); Assert.AreEqual(SqlWriterState.EndSelect, writer.WriteState); writer.WriteUnion(); Assert.AreEqual(SqlWriterState.Union, writer.WriteState); writer.WriteStartSelect(); writer.WriteColumn("p", "Id", null); writer.WriteColumn("p", "Name", null); writer.WriteStartFrom(); writer.WriteTable("Profiles", "p"); writer.WriteStartWhere(); writer.WriteColumn("p", "Age", null); writer.WriteOperator(SqlBinaryOperator.GreaterThanOrEqual); writer.WriteValue(30); writer.WriteEndSelect(); } Assert.AreEqual("SELECT [u].[Id], [u].[Name] FROM [Users] [u] WHERE ([u].[Age] <= 18) UNION SELECT [p].[Id], [p].[Name] FROM [Profiles] [p] WHERE ([p].[Age] >= 30)", builder.ToString()); }
public void WriteUnion_WhenSelectWithOrderBy_WritesUnionStatement() { StringBuilder builder = new StringBuilder(); using (SqlWriter writer = new SqlWriter(builder)) { writer.WriteStartSelect(); writer.WriteColumn("u", "Id", null); writer.WriteColumn("u", "Name", null); writer.WriteColumn("p", "Age", null); writer.WriteStartFrom(); writer.WriteTable("Users", "u"); writer.WriteStartJoin(SqlJoinType.Inner); writer.WriteTable("Profiles", "p"); writer.WriteStartOn(); writer.WriteColumn("u", "Id", null); writer.WriteOperator(SqlBinaryOperator.Equal); writer.WriteColumn("p", "UserId", null); writer.WriteStartWhere(); writer.WriteColumn("p", "Age", null); writer.WriteOperator(SqlBinaryOperator.LessThanOrEqual); writer.WriteValue(18); writer.WriteStartOrderBy(); writer.WriteColumn("p", "Age", null); writer.WriteSortOrder(SqlSortOrder.Descending); writer.WriteColumn("u", "Name", null); writer.WriteSortOrder(SqlSortOrder.Ascending); writer.WriteEndSelect(); Assert.AreEqual(SqlWriterState.EndSelect, writer.WriteState); writer.WriteUnion(); Assert.AreEqual(SqlWriterState.Union, writer.WriteState); writer.WriteStartSelect(); writer.WriteColumn("u", "Id", null); writer.WriteColumn("u", "Name", null); writer.WriteColumn("p", "Age", null); writer.WriteStartFrom(); writer.WriteTable("Users", "u"); writer.WriteStartJoin(SqlJoinType.Inner); writer.WriteTable("Profiles", "p"); writer.WriteStartOn(); writer.WriteColumn("u", "Id", null); writer.WriteOperator(SqlBinaryOperator.Equal); writer.WriteColumn("p", "UserId", null); writer.WriteStartWhere(); writer.WriteColumn("p", "Age", null); writer.WriteOperator(SqlBinaryOperator.GreaterThanOrEqual); writer.WriteValue(30); writer.WriteStartOrderBy(); writer.WriteColumn("p", "Age", null); writer.WriteSortOrder(SqlSortOrder.Descending); writer.WriteColumn("u", "Name", null); writer.WriteSortOrder(SqlSortOrder.Ascending); writer.WriteEndSelect(); } Assert.AreEqual("SELECT [u].[Id], [u].[Name], [p].[Age] FROM [Users] [u] INNER JOIN [Profiles] [p] ON ([u].[Id] = [p].[UserId]) WHERE ([p].[Age] <= 18) ORDER BY [p].[Age] DESC, [u].[Name] ASC UNION SELECT [u].[Id], [u].[Name], [p].[Age] FROM [Users] [u] INNER JOIN [Profiles] [p] ON ([u].[Id] = [p].[UserId]) WHERE ([p].[Age] >= 30) ORDER BY [p].[Age] DESC, [u].[Name] ASC", builder.ToString()); }
/// <summary> /// Writes the specified result set limitation for the current SQL dialect. /// Writes the <c>LIMIT <paramref name="offset"/>, <paramref name="count"/></c> clause /// to the output <paramref name="writer"/>. /// syntax. /// </summary> /// <param name="writer"> /// The <see cref="SqlWriter"/> to write to. /// </param> /// <param name="offset"> /// The row offset at which to start. /// </param> /// <param name="count"> /// The number of rows to fetch. /// </param> public override void WriteLimit(SqlWriter writer, int?offset, int?count) { writer.WriteKeyword(MySqlKeywords.Limit); if (offset != null) { writer.WriteValue(offset.GetValueOrDefault()); writer.WriteRaw(","); } writer.WriteValue(count.GetValueOrDefault(int.MaxValue)); }
/// <summary> /// Writes the specified result set limitation for the current SQL dialect. /// Writes the <c>LIMIT <paramref name="offset"/>, <paramref name="count"/></c> clause /// to the output <paramref name="writer"/>. /// syntax. /// </summary> /// <param name="writer"> /// The <see cref="SqlWriter"/> to write to. /// </param> /// <param name="offset"> /// The row offset at which to start. /// </param> /// <param name="count"> /// The number of rows to fetch. /// </param> public override void WriteLimit(SqlWriter writer, int? offset, int? count) { writer.WriteKeyword(MySqlKeywords.Limit); if (offset != null) { writer.WriteValue(offset.GetValueOrDefault()); writer.WriteRaw(","); } writer.WriteValue(count.GetValueOrDefault(int.MaxValue)); }
public void WriteStartFrom_WhenSelectStatement_WritesWhere() { StringBuilder builder = new StringBuilder(); using (SqlWriter writer = new SqlWriter(builder)) { writer.WriteStartSelect(); writer.WriteColumn("Id"); writer.WriteColumn("Name", "n"); writer.WriteColumn("Users", "Email", "e"); writer.WriteStartFrom(); writer.WriteTable("Users"); writer.WriteStartWhere(); Assert.AreEqual(SqlWriterState.StartWhere, writer.WriteState); writer.WriteColumn("Id"); writer.WriteOperator(SqlBinaryOperator.Equal); writer.WriteParameter("Id"); writer.WriteOperator(SqlBinaryOperator.Or); writer.WriteColumn("Id"); writer.WriteOperator(SqlBinaryOperator.LessThan); writer.WriteValue(100); } Assert.AreEqual("SELECT [Id], [Name] AS [n], [Users].[Email] AS [e] FROM [Users] WHERE ([Id] = @Id) OR ([Id] < 100)", builder.ToString()); }
/// <summary> /// Writes the specified result set limitation for the current SQL dialect. The default /// implementation uses the <c>OFFSET <paramref name="offset"/> ROWS FETCH FIRST <paramref name="count"/> ROWS ONLY</c> /// syntax. /// </summary> /// <param name="writer"> /// The <see cref="SqlWriter"/> to write to. /// </param> /// <param name="offset"> /// The row offset at which to start. /// </param> /// <param name="count"> /// The number of rows to fetch. /// </param> public virtual void WriteLimit(SqlWriter writer, int?offset, int?count) { if (offset != null) { writer.WriteKeyword(SqlKeywords.Offset); writer.WriteValue(offset.Value); writer.WriteKeyword(SqlKeywords.Rows); } if (count != null) { writer.WriteKeyword(SqlKeywords.Fetch); writer.WriteKeyword(SqlKeywords.First); writer.WriteValue(count.Value); writer.WriteKeyword(SqlKeywords.Rows); writer.WriteKeyword(SqlKeywords.Only); } }
public void WriteValue_WhenBulkInsertStatement_WritesValues() { StringBuilder builder = new StringBuilder(); using (SqlWriter writer = new SqlWriter(builder)) { writer.WriteStartInsert(); writer.WriteStartInto(); writer.WriteTable("Users"); writer.WriteColumn("Id"); writer.WriteColumn("UserName"); writer.WriteColumn("Email"); writer.WriteStartValues(); writer.WriteOpenParenthesis(); Assert.AreEqual(SqlWriterState.StartValues, writer.WriteState); writer.WriteValue(15); writer.WriteValue("My user name."); writer.WriteValue("*****@*****.**"); writer.WriteEndValues(); Assert.AreEqual(SqlWriterState.EndValues, writer.WriteState); writer.WriteStartValues(); Assert.AreEqual(SqlWriterState.StartValues, writer.WriteState); writer.WriteValue(16); writer.WriteValue("My second user name."); writer.WriteValue("*****@*****.**"); writer.WriteEndValues(); Assert.AreEqual(SqlWriterState.EndValues, writer.WriteState); writer.WriteCloseParenthesis(); } Assert.AreEqual("INSERT INTO [Users] ([Id], [UserName], [Email]) VALUES ((15, 'My user name.', '*****@*****.**'), (16, 'My second user name.', '*****@*****.**'))", builder.ToString()); }
public void WriteUnion_WhenSelectWithJoin_WritesUnionStatement() { StringBuilder builder = new StringBuilder(); using (SqlWriter writer = new SqlWriter(builder)) { writer.WriteStartSelect(); writer.WriteColumn("u", "Id", null); writer.WriteColumn("u", "Name", null); writer.WriteColumn("p", "Age", null); writer.WriteStartFrom(); writer.WriteTable("Users", "u"); writer.WriteStartJoin(SqlJoinType.Inner); writer.WriteTable("Profiles", "p"); writer.WriteStartOn(); writer.WriteColumn("u", "Id", null); writer.WriteOperator(SqlBinaryOperator.Equal); writer.WriteColumn("p", "UserId", null); //writer.WriteStartWhere(); //writer.WriteColumn("u", "Age", null); //writer.WriteOperator(SqlBinaryOperator.LessThanOrEqual); //writer.WriteValue(18); writer.WriteEndSelect(); Assert.AreEqual(SqlWriterState.EndSelect, writer.WriteState); writer.WriteUnion(); Assert.AreEqual(SqlWriterState.Union, writer.WriteState); writer.WriteStartSelect(); writer.WriteColumn("u", "Id", null); writer.WriteColumn("u", "Name", null); writer.WriteColumn("p", "Age", null); writer.WriteStartFrom(); writer.WriteTable("Users", "u"); writer.WriteStartJoin(SqlJoinType.Inner); writer.WriteTable("Profiles", "p"); writer.WriteStartOn(); writer.WriteColumn("u", "Id", null); writer.WriteOperator(SqlBinaryOperator.Equal); writer.WriteColumn("p", "UserId", null); writer.WriteStartWhere(); writer.WriteColumn("p", "Age", null); writer.WriteOperator(SqlBinaryOperator.GreaterThanOrEqual); writer.WriteValue(30); writer.WriteEndSelect(); } Assert.AreEqual("SELECT [u].[Id], [u].[Name], [p].[Age] FROM [Users] [u] INNER JOIN [Profiles] [p] ON ([u].[Id] = [p].[UserId]) UNION SELECT [u].[Id], [u].[Name], [p].[Age] FROM [Users] [u] INNER JOIN [Profiles] [p] ON ([u].[Id] = [p].[UserId]) WHERE ([p].[Age] >= 30)", builder.ToString()); }
public void WriteStartSet_WhenUpdateStatement_WritesParametersAndValues() { StringBuilder builder = new StringBuilder(); using (SqlWriter writer = new SqlWriter(builder)) { writer.WriteStartUpdate(); writer.WriteTable("Users"); writer.WriteStartSet(); writer.WriteColumn("Id"); writer.WriteValue(15); writer.WriteColumn("UserName"); writer.WriteParameter("UserName"); writer.WriteColumn("Email"); writer.WriteParameter("Email"); Assert.AreEqual(SqlWriterState.Set, writer.WriteState); } Assert.AreEqual("UPDATE [Users] SET [Id] = 15, [UserName] = @UserName, [Email] = @Email", builder.ToString()); }
public void WriteStartOn_WritesOnClause() { StringBuilder builder = new StringBuilder(); using (SqlWriter writer = new SqlWriter(builder)) { writer.WriteStartSelect(); writer.WriteColumn("Id"); writer.WriteColumn("Name", "n"); writer.WriteColumn("Users", "Email", "e"); writer.WriteStartFrom(); writer.WriteTable("Users"); writer.WriteStartJoin(); writer.WriteTable("Profiles"); writer.WriteStartOn(); writer.WriteColumn("Users", "Id", null); writer.WriteOperator(SqlBinaryOperator.Equal); writer.WriteColumn("Profiles", "UserId", null); writer.WriteOperator(SqlBinaryOperator.And); writer.WriteColumn("Users", "Name", null); writer.WriteOperator(SqlBinaryOperator.Equal); writer.WriteParameter("Name"); writer.WriteStartWhere(); Assert.AreEqual(SqlWriterState.StartWhere, writer.WriteState); writer.WriteColumn("Id"); writer.WriteOperator(SqlBinaryOperator.Equal); writer.WriteParameter("Id"); writer.WriteOperator(SqlBinaryOperator.Or); writer.WriteColumn("Id"); writer.WriteOperator(SqlBinaryOperator.LessThan); writer.WriteValue(100); writer.WriteStartOrderBy(); writer.WriteColumn("Id"); writer.WriteSortOrder(SqlSortOrder.Ascending); writer.WriteColumn("Name"); writer.WriteSortOrder(SqlSortOrder.Descending); } Assert.AreEqual("SELECT [Id], [Name] AS [n], [Users].[Email] AS [e] FROM [Users] JOIN [Profiles] ON ([Users].[Id] = [Profiles].[UserId]) AND ([Users].[Name] = @Name) WHERE ([Id] = @Id) OR ([Id] < 100) ORDER BY [Id] ASC, [Name] DESC", builder.ToString()); }
/// <summary> /// Writes the specified result set limitation for the current SQL dialect. The default /// implementation uses the <c>OFFSET <paramref name="offset"/> ROWS FETCH FIRST <paramref name="count"/> ROWS ONLY</c> /// syntax. /// </summary> /// <param name="writer"> /// The <see cref="SqlWriter"/> to write to. /// </param> /// <param name="offset"> /// The row offset at which to start. /// </param> /// <param name="count"> /// The number of rows to fetch. /// </param> public virtual void WriteLimit(SqlWriter writer, int? offset, int? count) { if (offset != null) { writer.WriteKeyword(SqlKeywords.Offset); writer.WriteValue(offset.Value); writer.WriteKeyword(SqlKeywords.Rows); } if (count != null) { writer.WriteKeyword(SqlKeywords.Fetch); writer.WriteKeyword(SqlKeywords.First); writer.WriteValue(count.Value); writer.WriteKeyword(SqlKeywords.Rows); writer.WriteKeyword(SqlKeywords.Only); } }
public override void Visit(SqlConstant expression) { _writer.WriteValue(expression.Value); }
public void WriteValue_WhenInsertStatement_WritesValues() { StringBuilder builder = new StringBuilder(); using (SqlWriter writer = new SqlWriter(builder)) { writer.WriteStartInsert(); writer.WriteStartInto(); writer.WriteTable("Users"); writer.WriteColumn("Id"); writer.WriteColumn("UserName"); writer.WriteColumn("Email"); writer.WriteStartValues(); Assert.AreEqual(SqlWriterState.StartValues, writer.WriteState); writer.WriteValue(15); writer.WriteValue("My user name."); writer.WriteValue("*****@*****.**"); writer.WriteEndValues(); Assert.AreEqual(SqlWriterState.EndValues, writer.WriteState); } Assert.AreEqual("INSERT INTO [Users] ([Id], [UserName], [Email]) VALUES (15, 'My user name.', '*****@*****.**')", builder.ToString()); }