Add arithmetic and joined-alias helpers to typed SQL DSL

This commit is contained in:
root
2026-02-27 08:49:00 +01:00
parent f293bd95c6
commit c0fb2e5232
4 changed files with 291 additions and 6 deletions

View File

@@ -15830,11 +15830,21 @@ namespace DynamORM
{
return new TypedSqlValueExpression<object>(value);
}
/// <summary>Create typed table context for an explicitly named alias, including joined aliases.</summary>
public static TypedTableContext<T> Table<T>(string alias)
{
return new TypedTableContext<T>(alias);
}
/// <summary>Create raw SQL expression.</summary>
public static TypedSqlExpression<T> Raw<T>(string sql)
{
return new TypedSqlRawExpression<T>(sql);
}
/// <summary>Create raw ORDER BY fragment.</summary>
public static TypedSqlOrderExpression RawOrder(string sql)
{
return new TypedSqlRawOrderExpression(Raw<object>(sql));
}
/// <summary>Create generic function call.</summary>
public static TypedSqlExpression<T> Func<T>(string name, params TypedSqlExpression[] arguments)
{
@@ -15979,6 +15989,31 @@ namespace DynamORM
/// <summary>Base SQL expression for the typed DSL.</summary>
public abstract class TypedSqlExpression : TypedSqlSelectable
{
/// <summary>Add arithmetic expression.</summary>
public static TypedSqlExpression<object> operator +(TypedSqlExpression left, TypedSqlExpression right)
{
return new TypedSqlBinaryExpression(left, "+", right);
}
/// <summary>Subtract arithmetic expression.</summary>
public static TypedSqlExpression<object> operator -(TypedSqlExpression left, TypedSqlExpression right)
{
return new TypedSqlBinaryExpression(left, "-", right);
}
/// <summary>Multiply arithmetic expression.</summary>
public static TypedSqlExpression<object> operator *(TypedSqlExpression left, TypedSqlExpression right)
{
return new TypedSqlBinaryExpression(left, "*", right);
}
/// <summary>Divide arithmetic expression.</summary>
public static TypedSqlExpression<object> operator /(TypedSqlExpression left, TypedSqlExpression right)
{
return new TypedSqlBinaryExpression(left, "/", right);
}
/// <summary>Modulo arithmetic expression.</summary>
public static TypedSqlExpression<object> operator %(TypedSqlExpression left, TypedSqlExpression right)
{
return new TypedSqlBinaryExpression(left, "%", right);
}
/// <summary>Alias this expression in SELECT clause.</summary>
public TypedSqlAliasedExpression As(string alias)
{
@@ -15994,6 +16029,31 @@ namespace DynamORM
{
return new TypedSqlOrderExpression(this, false);
}
/// <summary>Add expression to another value.</summary>
public TypedSqlExpression<object> Add(object value)
{
return new TypedSqlBinaryExpression(this, "+", value as TypedSqlExpression ?? Sql.Val(value));
}
/// <summary>Subtract another value.</summary>
public TypedSqlExpression<object> Sub(object value)
{
return new TypedSqlBinaryExpression(this, "-", value as TypedSqlExpression ?? Sql.Val(value));
}
/// <summary>Multiply by another value.</summary>
public TypedSqlExpression<object> Mul(object value)
{
return new TypedSqlBinaryExpression(this, "*", value as TypedSqlExpression ?? Sql.Val(value));
}
/// <summary>Divide by another value.</summary>
public TypedSqlExpression<object> Div(object value)
{
return new TypedSqlBinaryExpression(this, "/", value as TypedSqlExpression ?? Sql.Val(value));
}
/// <summary>Modulo by another value.</summary>
public TypedSqlExpression<object> Mod(object value)
{
return new TypedSqlBinaryExpression(this, "%", value as TypedSqlExpression ?? Sql.Val(value));
}
/// <summary>Equality predicate.</summary>
public TypedSqlPredicate Eq(object value)
{
@@ -16120,19 +16180,63 @@ namespace DynamORM
}
}
/// <summary>Ordered SQL expression.</summary>
public sealed class TypedSqlOrderExpression : TypedSqlSelectable
public class TypedSqlOrderExpression : TypedSqlSelectable
{
private readonly TypedSqlExpression _expression;
private readonly bool _ascending;
private readonly string _nullOrdering;
private readonly bool _raw;
internal TypedSqlOrderExpression(TypedSqlExpression expression, bool ascending)
internal TypedSqlOrderExpression(TypedSqlExpression expression, bool ascending, string nullOrdering = null, bool raw = false)
{
_expression = expression;
_ascending = ascending;
_nullOrdering = nullOrdering;
_raw = raw;
}
/// <summary>Append NULLS FIRST ordering.</summary>
public TypedSqlOrderExpression NullsFirst()
{
return new TypedSqlOrderExpression(_expression, _ascending, "NULLS FIRST", _raw);
}
/// <summary>Append NULLS LAST ordering.</summary>
public TypedSqlOrderExpression NullsLast()
{
return new TypedSqlOrderExpression(_expression, _ascending, "NULLS LAST", _raw);
}
internal override string Render(ITypedSqlRenderContext context)
{
return string.Format("{0} {1}", _expression.Render(context), _ascending ? "ASC" : "DESC");
string rendered = _raw
? _expression.Render(context)
: string.Format("{0} {1}", _expression.Render(context), _ascending ? "ASC" : "DESC");
if (!string.IsNullOrEmpty(_nullOrdering))
rendered = string.Format("{0} {1}", rendered, _nullOrdering);
return rendered;
}
}
internal sealed class TypedSqlRawOrderExpression : TypedSqlOrderExpression
{
internal TypedSqlRawOrderExpression(TypedSqlExpression expression)
: base(expression, true, null, true)
{
}
}
internal sealed class TypedSqlBinaryExpression : TypedSqlExpression<object>
{
private readonly TypedSqlExpression _left;
private readonly string _operator;
private readonly TypedSqlExpression _right;
internal TypedSqlBinaryExpression(TypedSqlExpression left, string op, TypedSqlExpression right)
{
_left = left;
_operator = op;
_right = right;
}
internal override string Render(ITypedSqlRenderContext context)
{
return string.Format("({0} {1} {2})", _left.Render(context), _operator, _right.Render(context));
}
}
internal sealed class TypedSqlColumnExpression<T> : TypedSqlExpression<T>