Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
allow select without table to support cross apply
  • Loading branch information
mnsrulz committed Nov 20, 2021
commit 24826597fc11b8a72ea47ae8a9df92090987bc04
35 changes: 35 additions & 0 deletions QueryBuilder.Tests/SelectTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -803,5 +803,40 @@ public void EscapeClauseThrowsForMultipleCharacters()
.HavingContains("Column1", @"TestString\%", false, @"\aa");
});
}


[Fact]
public void BasicSelectRaw_WithNoTable()
{
var q = new Query().SelectRaw("somefunction() as c1");

var c = Compilers.CompileFor(EngineCodes.SqlServer, q);
Assert.Equal("SELECT somefunction() as c1", c.ToString());
}

[Fact]
public void BasicSelect_WithNoTable()
{
var q = new Query().Select("c1");
var c = Compilers.CompileFor(EngineCodes.SqlServer, q);
Assert.Equal("SELECT [c1]", c.ToString());
}

[Fact]
public void CrossApply_Column_Reusability()
{
var q = new Query("users").Select("name", "salary", "taxbracket", "taxamount", "grosspay")
.CrossApply(new Query().SelectRaw("case when salary < 5000 then 10 when salary < 10000 then 20 else 30 end as taxbracket").As("t1"), j => j)
.CrossApply(new Query().SelectRaw("salary * taxbracket as taxamount").As("t2"), j => j)
.CrossApply(new Query().SelectRaw("salary - taxamount as grosspay").As("t3"), j => j);
var c = Compilers.CompileFor(EngineCodes.SqlServer, q);

Assert.Equal(string.Join("\n", new[] {
"SELECT [name], [salary], [taxbracket], [taxamount], [grosspay] FROM [users] ",
"CROSS APPLY (SELECT case when salary < 5000 then 10 when salary < 10000 then 20 else 30 end as taxbracket) AS [t1]",
"CROSS APPLY (SELECT salary * taxbracket as taxamount) AS [t2]",
"CROSS APPLY (SELECT salary - taxamount as grosspay) AS [t3]",
}), c.ToString());
}
}
}
10 changes: 5 additions & 5 deletions QueryBuilder/Compilers/Compiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -647,14 +647,14 @@ public virtual string CompileTableExpression(SqlResult ctx, AbstractFrom from)

public virtual string CompileFrom(SqlResult ctx)
{
if (!ctx.Query.HasComponent("from", EngineCode))
if (ctx.Query.HasComponent("from", EngineCode))
{
throw new InvalidOperationException("No table is set");
}
var from = ctx.Query.GetOneComponent<AbstractFrom>("from", EngineCode);

var from = ctx.Query.GetOneComponent<AbstractFrom>("from", EngineCode);
return "FROM " + CompileTableExpression(ctx, from);
}

return "FROM " + CompileTableExpression(ctx, from);
return string.Empty;
}

public virtual string CompileJoins(SqlResult ctx)
Expand Down
40 changes: 40 additions & 0 deletions QueryBuilder/Query.Join.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,5 +71,45 @@ public Query CrossJoin(string table)
return Join(j => j.JoinWith(table).AsCross());
}

public Query CrossApply(string table, string first, string second, string op = "=")
{
return Join(table, first, second, op, "cross apply");
}

public Query CrossApply(string table, Func<Join, Join> callback)
{
return Join(table, callback, "cross apply");
}

public Query CrossApply(Query query, Func<Join, Join> onCallback)
{
return Join(query, onCallback, "cross apply");
}

public Query CrossApply(Query query)
{
return Join(query, j => j, "cross apply");
}

public Query OuterApply(string table, string first, string second, string op = "=")
{
return Join(table, first, second, op, "outer apply");
}

public Query OuterApply(string table, Func<Join, Join> callback)
{
return Join(table, callback, "outer apply");
}

public Query OuterApply(Query query, Func<Join, Join> onCallback)
{
return Join(query, onCallback, "outer apply");
}

public Query OuterApply(Query query)
{
return Join(query, j => j, "outer apply");
}

}
}