Expand typed SQL DSL with predicates, subqueries and projections
This commit is contained in:
@@ -115,5 +115,134 @@ namespace DynamORM.Tests.TypedSql
|
||||
"DELETE FROM \"sample_users\" WHERE ((\"id\" = [$0]) AND (\"code\" <> [$1]))",
|
||||
NormalizeSql(cmd.CommandText()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestWhereSqlSupportsLikeInAndBetween()
|
||||
{
|
||||
var cmd = Database.FromTyped<TypedFluentUser>("u")
|
||||
.WhereSql(u => u.Col(x => x.Code).Like("A%")
|
||||
.And(u.Col(x => x.Id).In(1, 2, 3))
|
||||
.And(u.Col(x => x.Id).Between(1, 10)))
|
||||
.SelectSql(u => u.Col(x => x.Id));
|
||||
|
||||
Assert.AreEqual(
|
||||
"SELECT u.\"id_user\" FROM \"sample_users\" AS u WHERE (((u.\"user_code\" LIKE [$0]) AND (u.\"id_user\" IN([$1], [$2], [$3]))) AND (u.\"id_user\" BETWEEN [$4] AND [$5]))",
|
||||
NormalizeSql(cmd.CommandText()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestWhereSqlSupportsEmptyIn()
|
||||
{
|
||||
var cmd = Database.FromTyped<TypedFluentUser>("u")
|
||||
.WhereSql(u => u.Col(x => x.Id).In(new int[0]))
|
||||
.SelectSql(u => u.Col(x => x.Id));
|
||||
|
||||
Assert.AreEqual(
|
||||
"SELECT u.\"id_user\" FROM \"sample_users\" AS u WHERE (1 = 0)",
|
||||
NormalizeSql(cmd.CommandText()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestSelectSqlSupportsStandardFunctions()
|
||||
{
|
||||
var cmd = Database.FromTyped<TypedFluentUser>("u")
|
||||
.SelectSql(
|
||||
u => Sql.Sum<int>(u.Col(x => x.Id)).As("sum_id"),
|
||||
u => Sql.Avg<int>(u.Col(x => x.Id)).As("avg_id"),
|
||||
u => Sql.Min<int>(u.Col(x => x.Id)).As("min_id"),
|
||||
u => Sql.Max<int>(u.Col(x => x.Id)).As("max_id"),
|
||||
u => Sql.Abs<int>(Sql.Val(-5)).As("abs_value"),
|
||||
u => Sql.Upper(u.Col(x => x.Code)).As("upper_code"),
|
||||
u => Sql.Lower(u.Col(x => x.Code)).As("lower_code"),
|
||||
u => Sql.Trim(u.Col(x => x.Code)).As("trim_code"),
|
||||
u => Sql.Length(u.Col(x => x.Code)).As("len_code"),
|
||||
u => Sql.NullIf<string>(u.Col(x => x.Code), Sql.Val("X")).As("nullif_code"),
|
||||
u => Sql.CurrentTimestamp().As("ts"));
|
||||
|
||||
Assert.AreEqual(
|
||||
"SELECT SUM(u.\"id_user\") AS \"sum_id\", AVG(u.\"id_user\") AS \"avg_id\", MIN(u.\"id_user\") AS \"min_id\", MAX(u.\"id_user\") AS \"max_id\", ABS([$0]) AS \"abs_value\", UPPER(u.\"user_code\") AS \"upper_code\", LOWER(u.\"user_code\") AS \"lower_code\", TRIM(u.\"user_code\") AS \"trim_code\", LENGTH(u.\"user_code\") AS \"len_code\", NULLIF(u.\"user_code\", [$1]) AS \"nullif_code\", CURRENT_TIMESTAMP AS \"ts\" FROM \"sample_users\" AS u",
|
||||
NormalizeSql(cmd.CommandText()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestSelectSqlSupportsCustomFunction()
|
||||
{
|
||||
var cmd = Database.FromTyped<TypedFluentUser>("u")
|
||||
.SelectSql(u => Sql.Func<string>("CUSTOM_FUNC", u.Col(x => x.Code), Sql.Val(5)).As("custom_value"));
|
||||
|
||||
Assert.AreEqual(
|
||||
"SELECT CUSTOM_FUNC(u.\"user_code\", [$0]) AS \"custom_value\" FROM \"sample_users\" AS u",
|
||||
NormalizeSql(cmd.CommandText()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestSelectSqlSupportsScalarSubQuery()
|
||||
{
|
||||
var sq = Database.From(x => x.sample_users.As("x"))
|
||||
.Select(x => x.x.id_user)
|
||||
.Where(x => x.x.user_code == "A");
|
||||
|
||||
var cmd = Database.FromTyped<TypedFluentUser>("u")
|
||||
.SelectSql(u => Sql.SubQuery<long>(sq).As("sub_id"));
|
||||
|
||||
Assert.AreEqual(
|
||||
"SELECT (SELECT x.\"id_user\" FROM \"sample_users\" AS x WHERE (x.\"user_code\" = [$0])) AS \"sub_id\" FROM \"sample_users\" AS u",
|
||||
NormalizeSql(cmd.CommandText()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestWhereSqlSupportsExists()
|
||||
{
|
||||
var sq = Database.From(x => x.sample_users.As("x"))
|
||||
.Select(x => x.x.id_user)
|
||||
.Where(x => x.x.user_code == "A");
|
||||
|
||||
var cmd = Database.FromTyped<TypedFluentUser>("u")
|
||||
.WhereSql(u => Sql.Exists(sq))
|
||||
.SelectSql(u => u.Col(x => x.Id));
|
||||
|
||||
Assert.AreEqual(
|
||||
"SELECT u.\"id_user\" FROM \"sample_users\" AS u WHERE (EXISTS (SELECT x.\"id_user\" FROM \"sample_users\" AS x WHERE (x.\"user_code\" = [$0])))",
|
||||
NormalizeSql(cmd.CommandText()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestInsertSqlObjectProjection()
|
||||
{
|
||||
var sq = Database.From(x => x.sample_users.As("x"))
|
||||
.Select(x => x.x.user_code)
|
||||
.Where(x => x.x.id_user == 1);
|
||||
|
||||
var cmd = Database.InsertTyped<Users>()
|
||||
.InsertSql(u => new
|
||||
{
|
||||
Code = Sql.SubQuery<string>(sq),
|
||||
First = Sql.Upper(Sql.Val("typed"))
|
||||
});
|
||||
|
||||
Assert.AreEqual(
|
||||
"INSERT INTO \"sample_users\" (\"code\", \"first\") VALUES ((SELECT x.\"user_code\" FROM \"sample_users\" AS x WHERE (x.\"id_user\" = [$0])), UPPER([$1]))",
|
||||
NormalizeSql(cmd.CommandText()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestUpdateSqlObjectProjection()
|
||||
{
|
||||
var sq = Database.From(x => x.sample_users.As("x"))
|
||||
.Select(x => x.x.user_code)
|
||||
.Where(x => x.x.id_user == 1);
|
||||
|
||||
var cmd = Database.UpdateTyped<Users>()
|
||||
.SetSql(u => new
|
||||
{
|
||||
Code = Sql.SubQuery<string>(sq),
|
||||
First = Sql.Lower(Sql.Val("TYPED"))
|
||||
})
|
||||
.WhereSql(u => u.Col(x => x.Id).Eq(1));
|
||||
|
||||
Assert.AreEqual(
|
||||
"UPDATE \"sample_users\" SET \"code\" = (SELECT x.\"user_code\" FROM \"sample_users\" AS x WHERE (x.\"id_user\" = [$0])), \"first\" = LOWER([$1]) WHERE (\"id\" = [$2])",
|
||||
NormalizeSql(cmd.CommandText()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user