From e0ed9ed895c3737c04f2e463dbde122ed9e8ce5d Mon Sep 17 00:00:00 2001 From: root Date: Fri, 27 Feb 2026 09:53:20 +0100 Subject: [PATCH] Extend scoped typed select builder to deep join chains --- AmalgamationTool/DynamORM.Amalgamation.cs | 1049 ++++++++++++----- .../TypedSql/TypedSqlScopeDslTests.cs | 24 + .../IDynamicTypedSelectScopeQueryBuilder.cs | 72 +- .../DynamicTypedSelectQueryBuilder.cs | 8 +- .../DynamicTypedSelectScopeQueryBuilder.cs | 869 ++++++++++---- DynamORM/Builders/TypedScopeJoinBuilder.cs | 202 ++-- 6 files changed, 1597 insertions(+), 627 deletions(-) diff --git a/AmalgamationTool/DynamORM.Amalgamation.cs b/AmalgamationTool/DynamORM.Amalgamation.cs index 51e5c7c..7289be2 100644 --- a/AmalgamationTool/DynamORM.Amalgamation.cs +++ b/AmalgamationTool/DynamORM.Amalgamation.cs @@ -7375,17 +7375,15 @@ namespace DynamORM /// Add typed SQL DSL order-by expression using root and first four joined table contexts. IDynamicTypedSelectQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); } - /// Typed scope-based select builder with evolving join arity. - public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder + public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder { - IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); - IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedSqlSelectable> selector, params Func, TypedSqlSelectable>[] selectors); - IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedSqlPredicate> predicate); - IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedSqlPredicate> predicate); - IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedSqlExpression> selector, params Func, TypedSqlExpression>[] selectors); - IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedSqlOrderExpression> selector, params Func, TypedSqlOrderExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); + IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedSqlSelectable> selector, params Func, TypedSqlSelectable>[] selectors); + IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedSqlExpression> selector, params Func, TypedSqlExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedSqlOrderExpression> selector, params Func, TypedSqlOrderExpression>[] selectors); } - /// Typed scope-based select builder with two typed table contexts. public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder { IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); @@ -7395,7 +7393,6 @@ namespace DynamORM IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedSqlExpression>[] selectors); IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedSqlOrderExpression>[] selectors); } - /// Typed scope-based select builder with three typed table contexts. public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder { IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); @@ -7405,7 +7402,6 @@ namespace DynamORM IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); } - /// Typed scope-based select builder with four typed table contexts. public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder { IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); @@ -7415,15 +7411,59 @@ namespace DynamORM IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); } - /// Typed scope-based select builder with five typed table contexts. public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder { + IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors); IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); } + public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder + { + IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); + IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors); + IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); + } + public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder + { + IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); + IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors); + IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); + } + public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder + { + IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); + IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors); + IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); + } + public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder + { + IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); + IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors); + IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); + } + public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder + { + IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors); + IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); + } /// Typed update query builder for mapped entities. /// Mapped entity type. public interface IDynamicTypedUpdateQueryBuilder : IDynamicUpdateQueryBuilder @@ -7816,16 +7856,9 @@ namespace DynamORM public abstract class TypedScopeJoinBuilderBase where TSelf : TypedScopeJoinBuilderBase { - /// Gets join alias. public string Alias { get; private set; } - - /// Gets join type. public DynamicJoinType JoinType { get; private set; } - - /// Gets custom join type text. public string CustomJoinType { get; private set; } - - /// Gets a value indicating whether joined source should use NOLOCK. public bool UseNoLock { get; private set; } protected TypedScopeJoinBuilderBase() @@ -7837,59 +7870,19 @@ namespace DynamORM Alias = alias; return (TSelf)this; } - public TSelf Inner() - { - JoinType = DynamicJoinType.Inner; - CustomJoinType = null; - return (TSelf)this; - } - public TSelf Join() - { - JoinType = DynamicJoinType.Join; - CustomJoinType = null; - return (TSelf)this; - } - public TSelf Left() - { - JoinType = DynamicJoinType.Left; - CustomJoinType = null; - return (TSelf)this; - } - public TSelf Right() - { - JoinType = DynamicJoinType.Right; - CustomJoinType = null; - return (TSelf)this; - } - public TSelf Full() - { - JoinType = DynamicJoinType.Full; - CustomJoinType = null; - return (TSelf)this; - } - public TSelf LeftOuter() - { - JoinType = DynamicJoinType.LeftOuter; - CustomJoinType = null; - return (TSelf)this; - } - public TSelf RightOuter() - { - JoinType = DynamicJoinType.RightOuter; - CustomJoinType = null; - return (TSelf)this; - } - public TSelf FullOuter() - { - JoinType = DynamicJoinType.FullOuter; - CustomJoinType = null; - return (TSelf)this; - } + public TSelf Inner() { JoinType = DynamicJoinType.Inner; CustomJoinType = null; return (TSelf)this; } + public TSelf Join() { JoinType = DynamicJoinType.Join; CustomJoinType = null; return (TSelf)this; } + public TSelf Left() { JoinType = DynamicJoinType.Left; CustomJoinType = null; return (TSelf)this; } + public TSelf Right() { JoinType = DynamicJoinType.Right; CustomJoinType = null; return (TSelf)this; } + public TSelf Full() { JoinType = DynamicJoinType.Full; CustomJoinType = null; return (TSelf)this; } + public TSelf LeftOuter() { JoinType = DynamicJoinType.LeftOuter; CustomJoinType = null; return (TSelf)this; } + public TSelf RightOuter() { JoinType = DynamicJoinType.RightOuter; CustomJoinType = null; return (TSelf)this; } + public TSelf FullOuter() { JoinType = DynamicJoinType.FullOuter; CustomJoinType = null; return (TSelf)this; } + public TSelf Type(string joinType) { if (string.IsNullOrEmpty(joinType)) throw new ArgumentNullException("joinType"); - CustomJoinType = joinType.Trim(); return (TSelf)this; } @@ -7908,7 +7901,6 @@ namespace DynamORM { if (predicate == null) throw new ArgumentNullException("predicate"); - OnSqlPredicate = predicate; OnRawCondition = null; return this; @@ -7917,7 +7909,6 @@ namespace DynamORM { if (string.IsNullOrEmpty(condition)) throw new ArgumentNullException("condition"); - OnRawCondition = condition.Trim(); OnSqlPredicate = null; return this; @@ -7932,7 +7923,6 @@ namespace DynamORM { if (predicate == null) throw new ArgumentNullException("predicate"); - OnSqlPredicate = predicate; OnRawCondition = null; return this; @@ -7941,7 +7931,6 @@ namespace DynamORM { if (string.IsNullOrEmpty(condition)) throw new ArgumentNullException("condition"); - OnRawCondition = condition.Trim(); OnSqlPredicate = null; return this; @@ -7956,7 +7945,6 @@ namespace DynamORM { if (predicate == null) throw new ArgumentNullException("predicate"); - OnSqlPredicate = predicate; OnRawCondition = null; return this; @@ -7965,7 +7953,6 @@ namespace DynamORM { if (string.IsNullOrEmpty(condition)) throw new ArgumentNullException("condition"); - OnRawCondition = condition.Trim(); OnSqlPredicate = null; return this; @@ -7980,7 +7967,6 @@ namespace DynamORM { if (predicate == null) throw new ArgumentNullException("predicate"); - OnSqlPredicate = predicate; OnRawCondition = null; return this; @@ -7989,7 +7975,116 @@ namespace DynamORM { if (string.IsNullOrEmpty(condition)) throw new ArgumentNullException("condition"); + OnRawCondition = condition.Trim(); + OnSqlPredicate = null; + return this; + } + } + public sealed class TypedScopeJoinBuilder : TypedScopeJoinBuilderBase> + { + internal Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> OnSqlPredicate { get; private set; } + internal string OnRawCondition { get; private set; } + public TypedScopeJoinBuilder OnSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + OnSqlPredicate = predicate; + OnRawCondition = null; + return this; + } + public TypedScopeJoinBuilder OnRaw(string condition) + { + if (string.IsNullOrEmpty(condition)) + throw new ArgumentNullException("condition"); + OnRawCondition = condition.Trim(); + OnSqlPredicate = null; + return this; + } + } + public sealed class TypedScopeJoinBuilder : TypedScopeJoinBuilderBase> + { + internal Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> OnSqlPredicate { get; private set; } + internal string OnRawCondition { get; private set; } + + public TypedScopeJoinBuilder OnSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + OnSqlPredicate = predicate; + OnRawCondition = null; + return this; + } + public TypedScopeJoinBuilder OnRaw(string condition) + { + if (string.IsNullOrEmpty(condition)) + throw new ArgumentNullException("condition"); + OnRawCondition = condition.Trim(); + OnSqlPredicate = null; + return this; + } + } + public sealed class TypedScopeJoinBuilder : TypedScopeJoinBuilderBase> + { + internal Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> OnSqlPredicate { get; private set; } + internal string OnRawCondition { get; private set; } + + public TypedScopeJoinBuilder OnSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + OnSqlPredicate = predicate; + OnRawCondition = null; + return this; + } + public TypedScopeJoinBuilder OnRaw(string condition) + { + if (string.IsNullOrEmpty(condition)) + throw new ArgumentNullException("condition"); + OnRawCondition = condition.Trim(); + OnSqlPredicate = null; + return this; + } + } + public sealed class TypedScopeJoinBuilder : TypedScopeJoinBuilderBase> + { + internal Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> OnSqlPredicate { get; private set; } + internal string OnRawCondition { get; private set; } + + public TypedScopeJoinBuilder OnSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + OnSqlPredicate = predicate; + OnRawCondition = null; + return this; + } + public TypedScopeJoinBuilder OnRaw(string condition) + { + if (string.IsNullOrEmpty(condition)) + throw new ArgumentNullException("condition"); + OnRawCondition = condition.Trim(); + OnSqlPredicate = null; + return this; + } + } + public sealed class TypedScopeJoinBuilder : TypedScopeJoinBuilderBase> + { + internal Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> OnSqlPredicate { get; private set; } + internal string OnRawCondition { get; private set; } + + public TypedScopeJoinBuilder OnSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + OnSqlPredicate = predicate; + OnRawCondition = null; + return this; + } + public TypedScopeJoinBuilder OnRaw(string condition) + { + if (string.IsNullOrEmpty(condition)) + throw new ArgumentNullException("condition"); OnRawCondition = condition.Trim(); OnSqlPredicate = null; return this; @@ -11749,7 +11844,7 @@ namespace DynamORM AddSelectSqlSelector(selector(GetRootContext())); } - private void AddSelectSqlSelector(TypedSqlSelectable item) + internal void AddSelectSqlSelector(TypedSqlSelectable item) { if (item == null) throw new ArgumentNullException("item"); @@ -11783,7 +11878,7 @@ namespace DynamORM AddGroupBySqlSelector(selector(GetRootContext())); } - private void AddGroupBySqlSelector(TypedSqlExpression item) + internal void AddGroupBySqlSelector(TypedSqlExpression item) { if (item == null) throw new ArgumentNullException("item"); @@ -11813,7 +11908,7 @@ namespace DynamORM AddOrderBySqlSelector(selector(GetRootContext())); } - private void AddOrderBySqlSelector(TypedSqlOrderExpression item) + internal void AddOrderBySqlSelector(TypedSqlOrderExpression item) { TypedSqlRenderContext context = new TypedSqlRenderContext(this); string rendered = item.Render(context); @@ -12020,7 +12115,7 @@ namespace DynamORM Alias = alias }); } - private void AppendSqlCondition(string condition, bool having) + internal void AppendSqlCondition(string condition, bool having) { if (having) { @@ -12244,193 +12339,46 @@ namespace DynamORM public List> OnCreateParameter { get { return Builder.OnCreateParameter; } set { Builder.OnCreateParameter = value; } } public bool IsDisposed { get { return Builder.IsDisposed; } } - public void Dispose() - { - Builder.Dispose(); - } - public IDbCommand FillCommand(IDbCommand command) - { - return Builder.FillCommand(command); - } - public string CommandText() - { - return Builder.CommandText(); - } - public IEnumerable Execute() - { - return Builder.Execute(); - } - public IEnumerable Execute() where T : class - { - return Builder.Execute(); - } - public void ExecuteDataReader(Action reader) - { - Builder.ExecuteDataReader(reader); - } - public object Scalar() - { - return Builder.Scalar(); - } + public void Dispose() { Builder.Dispose(); } + public IDbCommand FillCommand(IDbCommand command) { return Builder.FillCommand(command); } + public string CommandText() { return Builder.CommandText(); } + public IEnumerable Execute() { return Builder.Execute(); } + public IEnumerable Execute() where T : class { return Builder.Execute(); } + public void ExecuteDataReader(Action reader) { Builder.ExecuteDataReader(reader); } + public object Scalar() { return Builder.Scalar(); } #if !DYNAMORM_OMMIT_GENERICEXECUTION && !DYNAMORM_OMMIT_TRYPARSE - public TResult ScalarAs(TResult defaultValue = default(TResult)) - { - return Builder.ScalarAs(defaultValue); - } + public TResult ScalarAs(TResult defaultValue = default(TResult)) { return Builder.ScalarAs(defaultValue); } #endif + public IDynamicSelectQueryBuilder From(Func fn, params Func[] func) { Builder.From(fn, func); return this; } + public IDynamicSelectQueryBuilder Join(params Func[] func) { Builder.Join(func); return this; } + public IDynamicSelectQueryBuilder Where(Func func) { Builder.Where(func); return this; } + public IDynamicSelectQueryBuilder Where(DynamicColumn column) { Builder.Where(column); return this; } + public IDynamicSelectQueryBuilder Where(string column, DynamicColumn.CompareOperator op, object value) { Builder.Where(column, op, value); return this; } + public IDynamicSelectQueryBuilder Where(string column, object value) { Builder.Where(column, value); return this; } + public IDynamicSelectQueryBuilder Where(object conditions, bool schema = false) { Builder.Where(conditions, schema); return this; } + public IDynamicSelectQueryBuilder Select(Func fn, params Func[] func) { Builder.Select(fn, func); return this; } + public IDynamicSelectQueryBuilder SelectColumn(params DynamicColumn[] columns) { Builder.SelectColumn(columns); return this; } + public IDynamicSelectQueryBuilder SelectColumn(params string[] columns) { Builder.SelectColumn(columns); return this; } + public IDynamicSelectQueryBuilder GroupBy(Func fn, params Func[] func) { Builder.GroupBy(fn, func); return this; } + public IDynamicSelectQueryBuilder GroupByColumn(params DynamicColumn[] columns) { Builder.GroupByColumn(columns); return this; } + public IDynamicSelectQueryBuilder GroupByColumn(params string[] columns) { Builder.GroupByColumn(columns); return this; } + public IDynamicSelectQueryBuilder Having(Func func) { Builder.Having(func); return this; } + public IDynamicSelectQueryBuilder Having(DynamicColumn column) { Builder.Having(column); return this; } + public IDynamicSelectQueryBuilder Having(string column, DynamicColumn.CompareOperator op, object value) { Builder.Having(column, op, value); return this; } + public IDynamicSelectQueryBuilder Having(string column, object value) { Builder.Having(column, value); return this; } + public IDynamicSelectQueryBuilder Having(object conditions, bool schema = false) { Builder.Having(conditions, schema); return this; } + public IDynamicSelectQueryBuilder OrderBy(Func fn, params Func[] func) { Builder.OrderBy(fn, func); return this; } + public IDynamicSelectQueryBuilder OrderByColumn(params DynamicColumn[] columns) { Builder.OrderByColumn(columns); return this; } + public IDynamicSelectQueryBuilder OrderByColumn(params string[] columns) { Builder.OrderByColumn(columns); return this; } + public IDynamicSelectQueryBuilder Top(int? top) { Builder.Top(top); return this; } + public IDynamicSelectQueryBuilder Limit(int? limit) { Builder.Limit(limit); return this; } + public IDynamicSelectQueryBuilder Offset(int? offset) { Builder.Offset(offset); return this; } + public IDynamicSelectQueryBuilder Distinct(bool distinct = true) { Builder.Distinct(distinct); return this; } - public IDynamicSelectQueryBuilder From(Func fn, params Func[] func) - { - Builder.From(fn, func); - return this; - } - public IDynamicSelectQueryBuilder Join(params Func[] func) - { - Builder.Join(func); - return this; - } - public IDynamicSelectQueryBuilder Where(Func func) - { - Builder.Where(func); - return this; - } - public IDynamicSelectQueryBuilder Where(DynamicColumn column) - { - Builder.Where(column); - return this; - } - public IDynamicSelectQueryBuilder Where(string column, DynamicColumn.CompareOperator op, object value) - { - Builder.Where(column, op, value); - return this; - } - public IDynamicSelectQueryBuilder Where(string column, object value) - { - Builder.Where(column, value); - return this; - } - public IDynamicSelectQueryBuilder Where(object conditions, bool schema = false) - { - Builder.Where(conditions, schema); - return this; - } - public IDynamicSelectQueryBuilder Select(Func fn, params Func[] func) - { - Builder.Select(fn, func); - return this; - } - public IDynamicSelectQueryBuilder SelectColumn(params DynamicColumn[] columns) - { - Builder.SelectColumn(columns); - return this; - } - public IDynamicSelectQueryBuilder SelectColumn(params string[] columns) - { - Builder.SelectColumn(columns); - return this; - } - public IDynamicSelectQueryBuilder GroupBy(Func fn, params Func[] func) - { - Builder.GroupBy(fn, func); - return this; - } - public IDynamicSelectQueryBuilder GroupByColumn(params DynamicColumn[] columns) - { - Builder.GroupByColumn(columns); - return this; - } - public IDynamicSelectQueryBuilder GroupByColumn(params string[] columns) - { - Builder.GroupByColumn(columns); - return this; - } - public IDynamicSelectQueryBuilder Having(Func func) - { - Builder.Having(func); - return this; - } - public IDynamicSelectQueryBuilder Having(DynamicColumn column) - { - Builder.Having(column); - return this; - } - public IDynamicSelectQueryBuilder Having(string column, DynamicColumn.CompareOperator op, object value) - { - Builder.Having(column, op, value); - return this; - } - public IDynamicSelectQueryBuilder Having(string column, object value) - { - Builder.Having(column, value); - return this; - } - public IDynamicSelectQueryBuilder Having(object conditions, bool schema = false) - { - Builder.Having(conditions, schema); - return this; - } - public IDynamicSelectQueryBuilder OrderBy(Func fn, params Func[] func) - { - Builder.OrderBy(fn, func); - return this; - } - public IDynamicSelectQueryBuilder OrderByColumn(params DynamicColumn[] columns) - { - Builder.OrderByColumn(columns); - return this; - } - public IDynamicSelectQueryBuilder OrderByColumn(params string[] columns) - { - Builder.OrderByColumn(columns); - return this; - } - public IDynamicSelectQueryBuilder Top(int? top) - { - Builder.Top(top); - return this; - } - public IDynamicSelectQueryBuilder Limit(int? limit) - { - Builder.Limit(limit); - return this; - } - public IDynamicSelectQueryBuilder Offset(int? offset) - { - Builder.Offset(offset); - return this; - } - public IDynamicSelectQueryBuilder Distinct(bool distinct = true) - { - Builder.Distinct(distinct); - return this; - } - protected string GetJoinKeyword(DynamicJoinType joinType) - { - switch (joinType) - { - case DynamicJoinType.Join: - return "JOIN"; - case DynamicJoinType.Left: - return "LEFT JOIN"; - case DynamicJoinType.Right: - return "RIGHT JOIN"; - case DynamicJoinType.Full: - return "FULL JOIN"; - case DynamicJoinType.LeftOuter: - return "LEFT OUTER JOIN"; - case DynamicJoinType.RightOuter: - return "RIGHT OUTER JOIN"; - case DynamicJoinType.FullOuter: - return "FULL OUTER JOIN"; - default: - return "INNER JOIN"; - } - } protected TypedJoinBuilder ApplyJoinSpec(TypedJoinBuilder builder, string alias, string customJoinType, DynamicJoinType joinType, bool noLock, string condition) { if (!string.IsNullOrEmpty(alias)) builder.As(alias); - if (!string.IsNullOrEmpty(customJoinType)) builder.Type(customJoinType); else @@ -12449,12 +12397,15 @@ namespace DynamORM } if (noLock) builder.NoLock(); - if (!string.IsNullOrEmpty(condition)) builder.OnRaw(condition); - return builder; } + protected void AddSelect(TypedSqlSelectable item) { Builder.AddSelectSqlSelector(item); } + protected void AddGroupBy(TypedSqlExpression item) { Builder.AddGroupBySqlSelector(item); } + protected void AddOrderBy(TypedSqlOrderExpression item) { Builder.AddOrderBySqlSelector(item); } + protected void AddWhere(TypedSqlPredicate predicate) { Builder.AppendSqlCondition(Builder.RenderScopeSqlPredicate(predicate), false); } + protected void AddHaving(TypedSqlPredicate predicate) { Builder.AppendSqlCondition(Builder.RenderScopeSqlPredicate(predicate), true); } } internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder { @@ -12465,43 +12416,62 @@ namespace DynamORM { _alias1 = alias1; } - public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) + public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) { if (specification == null) throw new ArgumentNullException("specification"); - TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); + TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); if (spec == null) throw new ArgumentException("Join specification cannot resolve to null.", "specification"); string alias = string.IsNullOrEmpty(spec.Alias) ? "t2" : spec.Alias; - string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(alias))); - Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); - return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, alias); + string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(alias))); + Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); + return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, alias); } public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedSqlSelectable> selector, params Func, TypedSqlSelectable>[] selectors) { - Builder.SelectSql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1))); return this; } public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedSqlPredicate> predicate) { - Builder.WhereSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1))); return this; } public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedSqlPredicate> predicate) { - Builder.HavingSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1))); return this; } public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedSqlExpression> selector, params Func, TypedSqlExpression>[] selectors) { - Builder.GroupBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1))); return this; } public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedSqlOrderExpression> selector, params Func, TypedSqlOrderExpression>[] selectors) { - Builder.OrderBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1))); return this; } } @@ -12532,27 +12502,46 @@ namespace DynamORM } public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedSqlSelectable>[] selectors) { - Builder.SelectSql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); return this; } public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.WhereSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); return this; } public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.HavingSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); return this; } public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedSqlExpression>[] selectors) { - Builder.GroupBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); return this; } public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedSqlOrderExpression>[] selectors) { - Builder.OrderBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); return this; } } @@ -12585,27 +12574,46 @@ namespace DynamORM } public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) { - Builder.SelectSql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); return this; } public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.WhereSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); return this; } public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.HavingSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); return this; } public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) { - Builder.GroupBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); return this; } public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) { - Builder.OrderBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); return this; } } @@ -12640,59 +12648,518 @@ namespace DynamORM } public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) { - Builder.SelectSql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); return this; } public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.WhereSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); return this; } public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.HavingSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); return this; } public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) { - Builder.GroupBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); return this; } public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) { - Builder.OrderBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); return this; } } internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder { + private readonly string _alias1; + private readonly string _alias2; + private readonly string _alias3; + private readonly string _alias4; + private readonly string _alias5; + internal DynamicTypedSelectScopeQueryBuilder(DynamicTypedSelectQueryBuilder builder, string alias1, string alias2, string alias3, string alias4, string alias5) : base(builder) { + _alias1 = alias1; + _alias2 = alias2; + _alias3 = alias3; + _alias4 = alias4; + _alias5 = alias5; + } + public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) + { + if (specification == null) + throw new ArgumentNullException("specification"); + + TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); + if (spec == null) + throw new ArgumentException("Join specification cannot resolve to null.", "specification"); + + string alias = string.IsNullOrEmpty(spec.Alias) ? "t6" : spec.Alias; + string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(alias))); + Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); + return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, _alias2, _alias3, _alias4, _alias5, alias); } public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) { - Builder.SelectSql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); return this; } public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.WhereSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); return this; } public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.HavingSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); return this; } public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) { - Builder.GroupBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); return this; } public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) { - Builder.OrderBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); + return this; + } + } + internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder + { + private readonly string _alias1; + private readonly string _alias2; + private readonly string _alias3; + private readonly string _alias4; + private readonly string _alias5; + private readonly string _alias6; + + internal DynamicTypedSelectScopeQueryBuilder(DynamicTypedSelectQueryBuilder builder, string alias1, string alias2, string alias3, string alias4, string alias5, string alias6) + : base(builder) + { + _alias1 = alias1; + _alias2 = alias2; + _alias3 = alias3; + _alias4 = alias4; + _alias5 = alias5; + _alias6 = alias6; + } + public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) + { + if (specification == null) + throw new ArgumentNullException("specification"); + + TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); + if (spec == null) + throw new ArgumentException("Join specification cannot resolve to null.", "specification"); + + string alias = string.IsNullOrEmpty(spec.Alias) ? "t7" : spec.Alias; + string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(alias))); + Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); + return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, _alias2, _alias3, _alias4, _alias5, _alias6, alias); + } + public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + return this; + } + } + internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder + { + private readonly string _alias1; + private readonly string _alias2; + private readonly string _alias3; + private readonly string _alias4; + private readonly string _alias5; + private readonly string _alias6; + private readonly string _alias7; + + internal DynamicTypedSelectScopeQueryBuilder(DynamicTypedSelectQueryBuilder builder, string alias1, string alias2, string alias3, string alias4, string alias5, string alias6, string alias7) + : base(builder) + { + _alias1 = alias1; + _alias2 = alias2; + _alias3 = alias3; + _alias4 = alias4; + _alias5 = alias5; + _alias6 = alias6; + _alias7 = alias7; + } + public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) + { + if (specification == null) + throw new ArgumentNullException("specification"); + + TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); + if (spec == null) + throw new ArgumentException("Join specification cannot resolve to null.", "specification"); + + string alias = string.IsNullOrEmpty(spec.Alias) ? "t8" : spec.Alias; + string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(alias))); + Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); + return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, _alias2, _alias3, _alias4, _alias5, _alias6, _alias7, alias); + } + public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + return this; + } + } + internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder + { + private readonly string _alias1; + private readonly string _alias2; + private readonly string _alias3; + private readonly string _alias4; + private readonly string _alias5; + private readonly string _alias6; + private readonly string _alias7; + private readonly string _alias8; + + internal DynamicTypedSelectScopeQueryBuilder(DynamicTypedSelectQueryBuilder builder, string alias1, string alias2, string alias3, string alias4, string alias5, string alias6, string alias7, string alias8) + : base(builder) + { + _alias1 = alias1; + _alias2 = alias2; + _alias3 = alias3; + _alias4 = alias4; + _alias5 = alias5; + _alias6 = alias6; + _alias7 = alias7; + _alias8 = alias8; + } + public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) + { + if (specification == null) + throw new ArgumentNullException("specification"); + + TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); + if (spec == null) + throw new ArgumentException("Join specification cannot resolve to null.", "specification"); + + string alias = string.IsNullOrEmpty(spec.Alias) ? "t9" : spec.Alias; + string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(alias))); + Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); + return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, _alias2, _alias3, _alias4, _alias5, _alias6, _alias7, _alias8, alias); + } + public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + return this; + } + } + internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder + { + private readonly string _alias1; + private readonly string _alias2; + private readonly string _alias3; + private readonly string _alias4; + private readonly string _alias5; + private readonly string _alias6; + private readonly string _alias7; + private readonly string _alias8; + private readonly string _alias9; + + internal DynamicTypedSelectScopeQueryBuilder(DynamicTypedSelectQueryBuilder builder, string alias1, string alias2, string alias3, string alias4, string alias5, string alias6, string alias7, string alias8, string alias9) + : base(builder) + { + _alias1 = alias1; + _alias2 = alias2; + _alias3 = alias3; + _alias4 = alias4; + _alias5 = alias5; + _alias6 = alias6; + _alias7 = alias7; + _alias8 = alias8; + _alias9 = alias9; + } + public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) + { + if (specification == null) + throw new ArgumentNullException("specification"); + + TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); + if (spec == null) + throw new ArgumentException("Join specification cannot resolve to null.", "specification"); + + string alias = string.IsNullOrEmpty(spec.Alias) ? "t10" : spec.Alias; + string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(alias))); + Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); + return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, _alias2, _alias3, _alias4, _alias5, _alias6, _alias7, _alias8, _alias9, alias); + } + public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + return this; + } + } + internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder + { + private readonly string _alias1; + private readonly string _alias2; + private readonly string _alias3; + private readonly string _alias4; + private readonly string _alias5; + private readonly string _alias6; + private readonly string _alias7; + private readonly string _alias8; + private readonly string _alias9; + private readonly string _alias10; + + internal DynamicTypedSelectScopeQueryBuilder(DynamicTypedSelectQueryBuilder builder, string alias1, string alias2, string alias3, string alias4, string alias5, string alias6, string alias7, string alias8, string alias9, string alias10) + : base(builder) + { + _alias1 = alias1; + _alias2 = alias2; + _alias3 = alias3; + _alias4 = alias4; + _alias5 = alias5; + _alias6 = alias6; + _alias7 = alias7; + _alias8 = alias8; + _alias9 = alias9; + _alias10 = alias10; + } + public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + return this; + } + public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); return this; } } diff --git a/DynamORM.Tests/TypedSql/TypedSqlScopeDslTests.cs b/DynamORM.Tests/TypedSql/TypedSqlScopeDslTests.cs index bab0937..95b21f5 100644 --- a/DynamORM.Tests/TypedSql/TypedSqlScopeDslTests.cs +++ b/DynamORM.Tests/TypedSql/TypedSqlScopeDslTests.cs @@ -122,5 +122,29 @@ namespace DynamORM.Tests.TypedSql "SELECT u.\"Id_User\" AS \"user_id\", d.\"Department_Name\" AS \"department_name\" FROM \"dbo\".\"Users\" AS u LEFT JOIN \"dbo\".\"UserClients\" AS c ON (u.\"Id_User\" = c.\"User_Id\") LEFT JOIN \"dbo\".\"UserRoles\" AS r ON (c.\"User_Id\" = r.\"User_Id\") LEFT JOIN \"dbo\".\"UserRegions\" AS g ON (r.\"User_Id\" = g.\"User_Id\") LEFT JOIN \"dbo\".\"UserDepartments\" AS d ON (g.\"Region_Id\" = d.\"Region_Id\") WHERE (d.\"Department_Id\" > [$0]) ORDER BY d.\"Department_Name\" ASC", NormalizeSql(cmd.CommandText())); } + + [Test] + public void TestScopeBuilderSupportsTenTypedTables() + { + var cmd = Database.FromTypedScope("a") + .Join(j => j.Left().As("b").OnSql((a, b) => a.Col(x => x.Id).Eq(b.Col(x => x.Id)))) + .Join(j => j.Left().As("c").OnSql((a, b, c) => b.Col(x => x.Id).Eq(c.Col(x => x.Id)))) + .Join(j => j.Left().As("d").OnSql((a, b, c, d) => c.Col(x => x.Id).Eq(d.Col(x => x.Id)))) + .Join(j => j.Left().As("e").OnSql((a, b, c, d, e) => d.Col(x => x.Id).Eq(e.Col(x => x.Id)))) + .Join(j => j.Left().As("f").OnSql((a, b, c, d, e, f) => e.Col(x => x.Id).Eq(f.Col(x => x.Id)))) + .Join(j => j.Left().As("g").OnSql((a, b, c, d, e, f, g) => f.Col(x => x.Id).Eq(g.Col(x => x.Id)))) + .Join(j => j.Left().As("h").OnSql((a, b, c, d, e, f, g, h) => g.Col(x => x.Id).Eq(h.Col(x => x.Id)))) + .Join(j => j.Left().As("i").OnSql((a, b, c, d, e, f, g, h, i) => h.Col(x => x.Id).Eq(i.Col(x => x.Id)))) + .Join(j => j.Left().As("j").OnSql((a, b, c, d, e, f, g, h, i, j) => i.Col(x => x.Id).Eq(j.Col(x => x.Id)))) + .SelectSql( + (a, b, c, d, e, f, g, h, i, j) => a.Col(x => x.Id).As("root_id"), + (a, b, c, d, e, f, g, h, i, j) => j.Col(x => x.Code).As("last_code")) + .WhereSql((a, b, c, d, e, f, g, h, i, j) => j.Col(x => x.Code).IsNotNull()) + .OrderBySql((a, b, c, d, e, f, g, h, i, j) => j.Col(x => x.Code).Asc()); + + Assert.AreEqual( + "SELECT a.\"id_user\" AS \"root_id\", j.\"user_code\" AS \"last_code\" FROM \"sample_users\" AS a LEFT JOIN \"sample_users\" AS b ON (a.\"id_user\" = b.\"id_user\") LEFT JOIN \"sample_users\" AS c ON (b.\"id_user\" = c.\"id_user\") LEFT JOIN \"sample_users\" AS d ON (c.\"id_user\" = d.\"id_user\") LEFT JOIN \"sample_users\" AS e ON (d.\"id_user\" = e.\"id_user\") LEFT JOIN \"sample_users\" AS f ON (e.\"id_user\" = f.\"id_user\") LEFT JOIN \"sample_users\" AS g ON (f.\"id_user\" = g.\"id_user\") LEFT JOIN \"sample_users\" AS h ON (g.\"id_user\" = h.\"id_user\") LEFT JOIN \"sample_users\" AS i ON (h.\"id_user\" = i.\"id_user\") LEFT JOIN \"sample_users\" AS j ON (i.\"id_user\" = j.\"id_user\") WHERE (j.\"user_code\" IS NOT NULL) ORDER BY j.\"user_code\" ASC", + NormalizeSql(cmd.CommandText())); + } } } diff --git a/DynamORM/Builders/IDynamicTypedSelectScopeQueryBuilder.cs b/DynamORM/Builders/IDynamicTypedSelectScopeQueryBuilder.cs index 9802ea9..78e6e9c 100644 --- a/DynamORM/Builders/IDynamicTypedSelectScopeQueryBuilder.cs +++ b/DynamORM/Builders/IDynamicTypedSelectScopeQueryBuilder.cs @@ -9,18 +9,16 @@ using DynamORM.TypedSql; namespace DynamORM.Builders { - /// Typed scope-based select builder with evolving join arity. - public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder + public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder { - IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); - IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedSqlSelectable> selector, params Func, TypedSqlSelectable>[] selectors); - IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedSqlPredicate> predicate); - IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedSqlPredicate> predicate); - IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedSqlExpression> selector, params Func, TypedSqlExpression>[] selectors); - IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedSqlOrderExpression> selector, params Func, TypedSqlOrderExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); + IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedSqlSelectable> selector, params Func, TypedSqlSelectable>[] selectors); + IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedSqlExpression> selector, params Func, TypedSqlExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedSqlOrderExpression> selector, params Func, TypedSqlOrderExpression>[] selectors); } - /// Typed scope-based select builder with two typed table contexts. public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder { IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); @@ -31,7 +29,6 @@ namespace DynamORM.Builders IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedSqlOrderExpression>[] selectors); } - /// Typed scope-based select builder with three typed table contexts. public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder { IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); @@ -42,7 +39,6 @@ namespace DynamORM.Builders IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); } - /// Typed scope-based select builder with four typed table contexts. public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder { IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); @@ -53,13 +49,63 @@ namespace DynamORM.Builders IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); } - /// Typed scope-based select builder with five typed table contexts. public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder { + IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors); IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); } -} + + public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder + { + IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); + IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors); + IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); + } + + public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder + { + IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); + IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors); + IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); + } + + public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder + { + IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); + IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors); + IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); + } + + public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder + { + IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification); + IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors); + IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); + } + + public interface IDynamicTypedSelectScopeQueryBuilder : IDynamicSelectQueryBuilder + { + IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors); + IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate); + IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors); + IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors); + } + +} \ No newline at end of file diff --git a/DynamORM/Builders/Implementation/DynamicTypedSelectQueryBuilder.cs b/DynamORM/Builders/Implementation/DynamicTypedSelectQueryBuilder.cs index 7bed59e..5b02ad4 100644 --- a/DynamORM/Builders/Implementation/DynamicTypedSelectQueryBuilder.cs +++ b/DynamORM/Builders/Implementation/DynamicTypedSelectQueryBuilder.cs @@ -678,7 +678,7 @@ namespace DynamORM.Builders.Implementation AddSelectSqlSelector(selector(GetRootContext())); } - private void AddSelectSqlSelector(TypedSqlSelectable item) + internal void AddSelectSqlSelector(TypedSqlSelectable item) { if (item == null) throw new ArgumentNullException("item"); @@ -715,7 +715,7 @@ namespace DynamORM.Builders.Implementation AddGroupBySqlSelector(selector(GetRootContext())); } - private void AddGroupBySqlSelector(TypedSqlExpression item) + internal void AddGroupBySqlSelector(TypedSqlExpression item) { if (item == null) throw new ArgumentNullException("item"); @@ -749,7 +749,7 @@ namespace DynamORM.Builders.Implementation AddOrderBySqlSelector(selector(GetRootContext())); } - private void AddOrderBySqlSelector(TypedSqlOrderExpression item) + internal void AddOrderBySqlSelector(TypedSqlOrderExpression item) { TypedSqlRenderContext context = new TypedSqlRenderContext(this); string rendered = item.Render(context); @@ -976,7 +976,7 @@ namespace DynamORM.Builders.Implementation }); } - private void AppendSqlCondition(string condition, bool having) + internal void AppendSqlCondition(string condition, bool having) { if (having) { diff --git a/DynamORM/Builders/Implementation/DynamicTypedSelectScopeQueryBuilder.cs b/DynamORM/Builders/Implementation/DynamicTypedSelectScopeQueryBuilder.cs index f2bb702..3e4e532 100644 --- a/DynamORM/Builders/Implementation/DynamicTypedSelectScopeQueryBuilder.cs +++ b/DynamORM/Builders/Implementation/DynamicTypedSelectScopeQueryBuilder.cs @@ -30,226 +30,46 @@ namespace DynamORM.Builders.Implementation public List> OnCreateParameter { get { return Builder.OnCreateParameter; } set { Builder.OnCreateParameter = value; } } public bool IsDisposed { get { return Builder.IsDisposed; } } - public void Dispose() - { - Builder.Dispose(); - } - - public IDbCommand FillCommand(IDbCommand command) - { - return Builder.FillCommand(command); - } - - public string CommandText() - { - return Builder.CommandText(); - } - - public IEnumerable Execute() - { - return Builder.Execute(); - } - - public IEnumerable Execute() where T : class - { - return Builder.Execute(); - } - - public void ExecuteDataReader(Action reader) - { - Builder.ExecuteDataReader(reader); - } - - public object Scalar() - { - return Builder.Scalar(); - } - + public void Dispose() { Builder.Dispose(); } + public IDbCommand FillCommand(IDbCommand command) { return Builder.FillCommand(command); } + public string CommandText() { return Builder.CommandText(); } + public IEnumerable Execute() { return Builder.Execute(); } + public IEnumerable Execute() where T : class { return Builder.Execute(); } + public void ExecuteDataReader(Action reader) { Builder.ExecuteDataReader(reader); } + public object Scalar() { return Builder.Scalar(); } #if !DYNAMORM_OMMIT_GENERICEXECUTION && !DYNAMORM_OMMIT_TRYPARSE - public TResult ScalarAs(TResult defaultValue = default(TResult)) - { - return Builder.ScalarAs(defaultValue); - } + public TResult ScalarAs(TResult defaultValue = default(TResult)) { return Builder.ScalarAs(defaultValue); } #endif - - public IDynamicSelectQueryBuilder From(Func fn, params Func[] func) - { - Builder.From(fn, func); - return this; - } - - public IDynamicSelectQueryBuilder Join(params Func[] func) - { - Builder.Join(func); - return this; - } - - public IDynamicSelectQueryBuilder Where(Func func) - { - Builder.Where(func); - return this; - } - - public IDynamicSelectQueryBuilder Where(DynamicColumn column) - { - Builder.Where(column); - return this; - } - - public IDynamicSelectQueryBuilder Where(string column, DynamicColumn.CompareOperator op, object value) - { - Builder.Where(column, op, value); - return this; - } - - public IDynamicSelectQueryBuilder Where(string column, object value) - { - Builder.Where(column, value); - return this; - } - - public IDynamicSelectQueryBuilder Where(object conditions, bool schema = false) - { - Builder.Where(conditions, schema); - return this; - } - - public IDynamicSelectQueryBuilder Select(Func fn, params Func[] func) - { - Builder.Select(fn, func); - return this; - } - - public IDynamicSelectQueryBuilder SelectColumn(params DynamicColumn[] columns) - { - Builder.SelectColumn(columns); - return this; - } - - public IDynamicSelectQueryBuilder SelectColumn(params string[] columns) - { - Builder.SelectColumn(columns); - return this; - } - - public IDynamicSelectQueryBuilder GroupBy(Func fn, params Func[] func) - { - Builder.GroupBy(fn, func); - return this; - } - - public IDynamicSelectQueryBuilder GroupByColumn(params DynamicColumn[] columns) - { - Builder.GroupByColumn(columns); - return this; - } - - public IDynamicSelectQueryBuilder GroupByColumn(params string[] columns) - { - Builder.GroupByColumn(columns); - return this; - } - - public IDynamicSelectQueryBuilder Having(Func func) - { - Builder.Having(func); - return this; - } - - public IDynamicSelectQueryBuilder Having(DynamicColumn column) - { - Builder.Having(column); - return this; - } - - public IDynamicSelectQueryBuilder Having(string column, DynamicColumn.CompareOperator op, object value) - { - Builder.Having(column, op, value); - return this; - } - - public IDynamicSelectQueryBuilder Having(string column, object value) - { - Builder.Having(column, value); - return this; - } - - public IDynamicSelectQueryBuilder Having(object conditions, bool schema = false) - { - Builder.Having(conditions, schema); - return this; - } - - public IDynamicSelectQueryBuilder OrderBy(Func fn, params Func[] func) - { - Builder.OrderBy(fn, func); - return this; - } - - public IDynamicSelectQueryBuilder OrderByColumn(params DynamicColumn[] columns) - { - Builder.OrderByColumn(columns); - return this; - } - - public IDynamicSelectQueryBuilder OrderByColumn(params string[] columns) - { - Builder.OrderByColumn(columns); - return this; - } - - public IDynamicSelectQueryBuilder Top(int? top) - { - Builder.Top(top); - return this; - } - - public IDynamicSelectQueryBuilder Limit(int? limit) - { - Builder.Limit(limit); - return this; - } - - public IDynamicSelectQueryBuilder Offset(int? offset) - { - Builder.Offset(offset); - return this; - } - - public IDynamicSelectQueryBuilder Distinct(bool distinct = true) - { - Builder.Distinct(distinct); - return this; - } - - protected string GetJoinKeyword(DynamicJoinType joinType) - { - switch (joinType) - { - case DynamicJoinType.Join: - return "JOIN"; - case DynamicJoinType.Left: - return "LEFT JOIN"; - case DynamicJoinType.Right: - return "RIGHT JOIN"; - case DynamicJoinType.Full: - return "FULL JOIN"; - case DynamicJoinType.LeftOuter: - return "LEFT OUTER JOIN"; - case DynamicJoinType.RightOuter: - return "RIGHT OUTER JOIN"; - case DynamicJoinType.FullOuter: - return "FULL OUTER JOIN"; - default: - return "INNER JOIN"; - } - } + public IDynamicSelectQueryBuilder From(Func fn, params Func[] func) { Builder.From(fn, func); return this; } + public IDynamicSelectQueryBuilder Join(params Func[] func) { Builder.Join(func); return this; } + public IDynamicSelectQueryBuilder Where(Func func) { Builder.Where(func); return this; } + public IDynamicSelectQueryBuilder Where(DynamicColumn column) { Builder.Where(column); return this; } + public IDynamicSelectQueryBuilder Where(string column, DynamicColumn.CompareOperator op, object value) { Builder.Where(column, op, value); return this; } + public IDynamicSelectQueryBuilder Where(string column, object value) { Builder.Where(column, value); return this; } + public IDynamicSelectQueryBuilder Where(object conditions, bool schema = false) { Builder.Where(conditions, schema); return this; } + public IDynamicSelectQueryBuilder Select(Func fn, params Func[] func) { Builder.Select(fn, func); return this; } + public IDynamicSelectQueryBuilder SelectColumn(params DynamicColumn[] columns) { Builder.SelectColumn(columns); return this; } + public IDynamicSelectQueryBuilder SelectColumn(params string[] columns) { Builder.SelectColumn(columns); return this; } + public IDynamicSelectQueryBuilder GroupBy(Func fn, params Func[] func) { Builder.GroupBy(fn, func); return this; } + public IDynamicSelectQueryBuilder GroupByColumn(params DynamicColumn[] columns) { Builder.GroupByColumn(columns); return this; } + public IDynamicSelectQueryBuilder GroupByColumn(params string[] columns) { Builder.GroupByColumn(columns); return this; } + public IDynamicSelectQueryBuilder Having(Func func) { Builder.Having(func); return this; } + public IDynamicSelectQueryBuilder Having(DynamicColumn column) { Builder.Having(column); return this; } + public IDynamicSelectQueryBuilder Having(string column, DynamicColumn.CompareOperator op, object value) { Builder.Having(column, op, value); return this; } + public IDynamicSelectQueryBuilder Having(string column, object value) { Builder.Having(column, value); return this; } + public IDynamicSelectQueryBuilder Having(object conditions, bool schema = false) { Builder.Having(conditions, schema); return this; } + public IDynamicSelectQueryBuilder OrderBy(Func fn, params Func[] func) { Builder.OrderBy(fn, func); return this; } + public IDynamicSelectQueryBuilder OrderByColumn(params DynamicColumn[] columns) { Builder.OrderByColumn(columns); return this; } + public IDynamicSelectQueryBuilder OrderByColumn(params string[] columns) { Builder.OrderByColumn(columns); return this; } + public IDynamicSelectQueryBuilder Top(int? top) { Builder.Top(top); return this; } + public IDynamicSelectQueryBuilder Limit(int? limit) { Builder.Limit(limit); return this; } + public IDynamicSelectQueryBuilder Offset(int? offset) { Builder.Offset(offset); return this; } + public IDynamicSelectQueryBuilder Distinct(bool distinct = true) { Builder.Distinct(distinct); return this; } protected TypedJoinBuilder ApplyJoinSpec(TypedJoinBuilder builder, string alias, string customJoinType, DynamicJoinType joinType, bool noLock, string condition) { if (!string.IsNullOrEmpty(alias)) builder.As(alias); - if (!string.IsNullOrEmpty(customJoinType)) builder.Type(customJoinType); else @@ -266,15 +86,18 @@ namespace DynamORM.Builders.Implementation default: builder.Inner(); break; } } - if (noLock) builder.NoLock(); - if (!string.IsNullOrEmpty(condition)) builder.OnRaw(condition); - return builder; } + + protected void AddSelect(TypedSqlSelectable item) { Builder.AddSelectSqlSelector(item); } + protected void AddGroupBy(TypedSqlExpression item) { Builder.AddGroupBySqlSelector(item); } + protected void AddOrderBy(TypedSqlOrderExpression item) { Builder.AddOrderBySqlSelector(item); } + protected void AddWhere(TypedSqlPredicate predicate) { Builder.AppendSqlCondition(Builder.RenderScopeSqlPredicate(predicate), false); } + protected void AddHaving(TypedSqlPredicate predicate) { Builder.AppendSqlCondition(Builder.RenderScopeSqlPredicate(predicate), true); } } internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder @@ -287,48 +110,67 @@ namespace DynamORM.Builders.Implementation _alias1 = alias1; } - public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) + public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) { if (specification == null) throw new ArgumentNullException("specification"); - TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); + TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); if (spec == null) throw new ArgumentException("Join specification cannot resolve to null.", "specification"); string alias = string.IsNullOrEmpty(spec.Alias) ? "t2" : spec.Alias; - string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(alias))); - Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); - return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, alias); + string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(alias))); + Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); + return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, alias); } public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedSqlSelectable> selector, params Func, TypedSqlSelectable>[] selectors) { - Builder.SelectSql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1))); return this; } public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedSqlPredicate> predicate) { - Builder.WhereSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1))); return this; } public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedSqlPredicate> predicate) { - Builder.HavingSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1))); return this; } public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedSqlExpression> selector, params Func, TypedSqlExpression>[] selectors) { - Builder.GroupBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1))); return this; } public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedSqlOrderExpression> selector, params Func, TypedSqlOrderExpression>[] selectors) { - Builder.OrderBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1))); return this; } } @@ -362,31 +204,50 @@ namespace DynamORM.Builders.Implementation public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedSqlSelectable>[] selectors) { - Builder.SelectSql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); return this; } public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.WhereSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); return this; } public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.HavingSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); return this; } public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedSqlExpression>[] selectors) { - Builder.GroupBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); return this; } public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedSqlOrderExpression>[] selectors) { - Builder.OrderBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2))); return this; } } @@ -422,31 +283,50 @@ namespace DynamORM.Builders.Implementation public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) { - Builder.SelectSql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); return this; } public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.WhereSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); return this; } public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.HavingSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); return this; } public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) { - Builder.GroupBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); return this; } public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) { - Builder.OrderBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3))); return this; } } @@ -484,70 +364,565 @@ namespace DynamORM.Builders.Implementation public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) { - Builder.SelectSql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); return this; } public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.WhereSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); return this; } public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.HavingSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); return this; } public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) { - Builder.GroupBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); return this; } public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) { - Builder.OrderBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4))); return this; } } internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder { + private readonly string _alias1; + private readonly string _alias2; + private readonly string _alias3; + private readonly string _alias4; + private readonly string _alias5; + internal DynamicTypedSelectScopeQueryBuilder(DynamicTypedSelectQueryBuilder builder, string alias1, string alias2, string alias3, string alias4, string alias5) : base(builder) { + _alias1 = alias1; + _alias2 = alias2; + _alias3 = alias3; + _alias4 = alias4; + _alias5 = alias5; + } + + public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) + { + if (specification == null) + throw new ArgumentNullException("specification"); + + TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); + if (spec == null) + throw new ArgumentException("Join specification cannot resolve to null.", "specification"); + + string alias = string.IsNullOrEmpty(spec.Alias) ? "t6" : spec.Alias; + string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(alias))); + Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); + return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, _alias2, _alias3, _alias4, _alias5, alias); } public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) { - Builder.SelectSql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); return this; } public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.WhereSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); return this; } public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) { - Builder.HavingSql(predicate); + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); return this; } public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) { - Builder.GroupBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); return this; } public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) { - Builder.OrderBySql(selector, selectors); + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5))); return this; } } -} + + internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder + { + private readonly string _alias1; + private readonly string _alias2; + private readonly string _alias3; + private readonly string _alias4; + private readonly string _alias5; + private readonly string _alias6; + + internal DynamicTypedSelectScopeQueryBuilder(DynamicTypedSelectQueryBuilder builder, string alias1, string alias2, string alias3, string alias4, string alias5, string alias6) + : base(builder) + { + _alias1 = alias1; + _alias2 = alias2; + _alias3 = alias3; + _alias4 = alias4; + _alias5 = alias5; + _alias6 = alias6; + } + + public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) + { + if (specification == null) + throw new ArgumentNullException("specification"); + + TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); + if (spec == null) + throw new ArgumentException("Join specification cannot resolve to null.", "specification"); + + string alias = string.IsNullOrEmpty(spec.Alias) ? "t7" : spec.Alias; + string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(alias))); + Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); + return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, _alias2, _alias3, _alias4, _alias5, _alias6, alias); + } + + public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6))); + return this; + } + } + + internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder + { + private readonly string _alias1; + private readonly string _alias2; + private readonly string _alias3; + private readonly string _alias4; + private readonly string _alias5; + private readonly string _alias6; + private readonly string _alias7; + + internal DynamicTypedSelectScopeQueryBuilder(DynamicTypedSelectQueryBuilder builder, string alias1, string alias2, string alias3, string alias4, string alias5, string alias6, string alias7) + : base(builder) + { + _alias1 = alias1; + _alias2 = alias2; + _alias3 = alias3; + _alias4 = alias4; + _alias5 = alias5; + _alias6 = alias6; + _alias7 = alias7; + } + + public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) + { + if (specification == null) + throw new ArgumentNullException("specification"); + + TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); + if (spec == null) + throw new ArgumentException("Join specification cannot resolve to null.", "specification"); + + string alias = string.IsNullOrEmpty(spec.Alias) ? "t8" : spec.Alias; + string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(alias))); + Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); + return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, _alias2, _alias3, _alias4, _alias5, _alias6, _alias7, alias); + } + + public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7))); + return this; + } + } + + internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder + { + private readonly string _alias1; + private readonly string _alias2; + private readonly string _alias3; + private readonly string _alias4; + private readonly string _alias5; + private readonly string _alias6; + private readonly string _alias7; + private readonly string _alias8; + + internal DynamicTypedSelectScopeQueryBuilder(DynamicTypedSelectQueryBuilder builder, string alias1, string alias2, string alias3, string alias4, string alias5, string alias6, string alias7, string alias8) + : base(builder) + { + _alias1 = alias1; + _alias2 = alias2; + _alias3 = alias3; + _alias4 = alias4; + _alias5 = alias5; + _alias6 = alias6; + _alias7 = alias7; + _alias8 = alias8; + } + + public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) + { + if (specification == null) + throw new ArgumentNullException("specification"); + + TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); + if (spec == null) + throw new ArgumentException("Join specification cannot resolve to null.", "specification"); + + string alias = string.IsNullOrEmpty(spec.Alias) ? "t9" : spec.Alias; + string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(alias))); + Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); + return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, _alias2, _alias3, _alias4, _alias5, _alias6, _alias7, _alias8, alias); + } + + public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8))); + return this; + } + } + + internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder + { + private readonly string _alias1; + private readonly string _alias2; + private readonly string _alias3; + private readonly string _alias4; + private readonly string _alias5; + private readonly string _alias6; + private readonly string _alias7; + private readonly string _alias8; + private readonly string _alias9; + + internal DynamicTypedSelectScopeQueryBuilder(DynamicTypedSelectQueryBuilder builder, string alias1, string alias2, string alias3, string alias4, string alias5, string alias6, string alias7, string alias8, string alias9) + : base(builder) + { + _alias1 = alias1; + _alias2 = alias2; + _alias3 = alias3; + _alias4 = alias4; + _alias5 = alias5; + _alias6 = alias6; + _alias7 = alias7; + _alias8 = alias8; + _alias9 = alias9; + } + + public IDynamicTypedSelectScopeQueryBuilder Join(Func, TypedScopeJoinBuilder> specification) + { + if (specification == null) + throw new ArgumentNullException("specification"); + + TypedScopeJoinBuilder spec = specification(new TypedScopeJoinBuilder()); + if (spec == null) + throw new ArgumentException("Join specification cannot resolve to null.", "specification"); + + string alias = string.IsNullOrEmpty(spec.Alias) ? "t10" : spec.Alias; + string condition = spec.OnSqlPredicate == null ? spec.OnRawCondition : Builder.RenderScopeSqlPredicate(spec.OnSqlPredicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(alias))); + Builder.Join(j => ApplyJoinSpec(j, alias, spec.CustomJoinType, spec.JoinType, spec.UseNoLock, condition)); + return new DynamicTypedSelectScopeQueryBuilder(Builder, _alias1, _alias2, _alias3, _alias4, _alias5, _alias6, _alias7, _alias8, _alias9, alias); + } + + public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9))); + return this; + } + } + + internal sealed class DynamicTypedSelectScopeQueryBuilder : DynamicTypedSelectScopeQueryBuilderBase, IDynamicTypedSelectScopeQueryBuilder + { + private readonly string _alias1; + private readonly string _alias2; + private readonly string _alias3; + private readonly string _alias4; + private readonly string _alias5; + private readonly string _alias6; + private readonly string _alias7; + private readonly string _alias8; + private readonly string _alias9; + private readonly string _alias10; + + internal DynamicTypedSelectScopeQueryBuilder(DynamicTypedSelectQueryBuilder builder, string alias1, string alias2, string alias3, string alias4, string alias5, string alias6, string alias7, string alias8, string alias9, string alias10) + : base(builder) + { + _alias1 = alias1; + _alias2 = alias2; + _alias3 = alias3; + _alias4 = alias4; + _alias5 = alias5; + _alias6 = alias6; + _alias7 = alias7; + _alias8 = alias8; + _alias9 = alias9; + _alias10 = alias10; + } + + public IDynamicTypedSelectScopeQueryBuilder SelectSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlSelectable>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddSelect(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + if (selectors != null) + foreach (var item in selectors) + AddSelect(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder WhereSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddWhere(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder HavingSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + AddHaving(predicate(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder GroupBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddGroupBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + if (selectors != null) + foreach (var item in selectors) + AddGroupBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + return this; + } + + public IDynamicTypedSelectScopeQueryBuilder OrderBySql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression> selector, params Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlOrderExpression>[] selectors) + { + if (selector == null) + throw new ArgumentNullException("selector"); + AddOrderBy(selector(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + if (selectors != null) + foreach (var item in selectors) + AddOrderBy(item(new TypedTableContext(_alias1), new TypedTableContext(_alias2), new TypedTableContext(_alias3), new TypedTableContext(_alias4), new TypedTableContext(_alias5), new TypedTableContext(_alias6), new TypedTableContext(_alias7), new TypedTableContext(_alias8), new TypedTableContext(_alias9), new TypedTableContext(_alias10))); + return this; + } + } + +} \ No newline at end of file diff --git a/DynamORM/Builders/TypedScopeJoinBuilder.cs b/DynamORM/Builders/TypedScopeJoinBuilder.cs index 8be2509..7f00084 100644 --- a/DynamORM/Builders/TypedScopeJoinBuilder.cs +++ b/DynamORM/Builders/TypedScopeJoinBuilder.cs @@ -12,16 +12,9 @@ namespace DynamORM.Builders public abstract class TypedScopeJoinBuilderBase where TSelf : TypedScopeJoinBuilderBase { - /// Gets join alias. public string Alias { get; private set; } - - /// Gets join type. public DynamicJoinType JoinType { get; private set; } - - /// Gets custom join type text. public string CustomJoinType { get; private set; } - - /// Gets a value indicating whether joined source should use NOLOCK. public bool UseNoLock { get; private set; } protected TypedScopeJoinBuilderBase() @@ -35,67 +28,19 @@ namespace DynamORM.Builders return (TSelf)this; } - public TSelf Inner() - { - JoinType = DynamicJoinType.Inner; - CustomJoinType = null; - return (TSelf)this; - } - - public TSelf Join() - { - JoinType = DynamicJoinType.Join; - CustomJoinType = null; - return (TSelf)this; - } - - public TSelf Left() - { - JoinType = DynamicJoinType.Left; - CustomJoinType = null; - return (TSelf)this; - } - - public TSelf Right() - { - JoinType = DynamicJoinType.Right; - CustomJoinType = null; - return (TSelf)this; - } - - public TSelf Full() - { - JoinType = DynamicJoinType.Full; - CustomJoinType = null; - return (TSelf)this; - } - - public TSelf LeftOuter() - { - JoinType = DynamicJoinType.LeftOuter; - CustomJoinType = null; - return (TSelf)this; - } - - public TSelf RightOuter() - { - JoinType = DynamicJoinType.RightOuter; - CustomJoinType = null; - return (TSelf)this; - } - - public TSelf FullOuter() - { - JoinType = DynamicJoinType.FullOuter; - CustomJoinType = null; - return (TSelf)this; - } + public TSelf Inner() { JoinType = DynamicJoinType.Inner; CustomJoinType = null; return (TSelf)this; } + public TSelf Join() { JoinType = DynamicJoinType.Join; CustomJoinType = null; return (TSelf)this; } + public TSelf Left() { JoinType = DynamicJoinType.Left; CustomJoinType = null; return (TSelf)this; } + public TSelf Right() { JoinType = DynamicJoinType.Right; CustomJoinType = null; return (TSelf)this; } + public TSelf Full() { JoinType = DynamicJoinType.Full; CustomJoinType = null; return (TSelf)this; } + public TSelf LeftOuter() { JoinType = DynamicJoinType.LeftOuter; CustomJoinType = null; return (TSelf)this; } + public TSelf RightOuter() { JoinType = DynamicJoinType.RightOuter; CustomJoinType = null; return (TSelf)this; } + public TSelf FullOuter() { JoinType = DynamicJoinType.FullOuter; CustomJoinType = null; return (TSelf)this; } public TSelf Type(string joinType) { if (string.IsNullOrEmpty(joinType)) throw new ArgumentNullException("joinType"); - CustomJoinType = joinType.Trim(); return (TSelf)this; } @@ -116,7 +61,6 @@ namespace DynamORM.Builders { if (predicate == null) throw new ArgumentNullException("predicate"); - OnSqlPredicate = predicate; OnRawCondition = null; return this; @@ -126,7 +70,6 @@ namespace DynamORM.Builders { if (string.IsNullOrEmpty(condition)) throw new ArgumentNullException("condition"); - OnRawCondition = condition.Trim(); OnSqlPredicate = null; return this; @@ -142,7 +85,6 @@ namespace DynamORM.Builders { if (predicate == null) throw new ArgumentNullException("predicate"); - OnSqlPredicate = predicate; OnRawCondition = null; return this; @@ -152,7 +94,6 @@ namespace DynamORM.Builders { if (string.IsNullOrEmpty(condition)) throw new ArgumentNullException("condition"); - OnRawCondition = condition.Trim(); OnSqlPredicate = null; return this; @@ -168,7 +109,6 @@ namespace DynamORM.Builders { if (predicate == null) throw new ArgumentNullException("predicate"); - OnSqlPredicate = predicate; OnRawCondition = null; return this; @@ -178,7 +118,6 @@ namespace DynamORM.Builders { if (string.IsNullOrEmpty(condition)) throw new ArgumentNullException("condition"); - OnRawCondition = condition.Trim(); OnSqlPredicate = null; return this; @@ -194,7 +133,6 @@ namespace DynamORM.Builders { if (predicate == null) throw new ArgumentNullException("predicate"); - OnSqlPredicate = predicate; OnRawCondition = null; return this; @@ -204,10 +142,130 @@ namespace DynamORM.Builders { if (string.IsNullOrEmpty(condition)) throw new ArgumentNullException("condition"); - OnRawCondition = condition.Trim(); OnSqlPredicate = null; return this; } } -} + + public sealed class TypedScopeJoinBuilder : TypedScopeJoinBuilderBase> + { + internal Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> OnSqlPredicate { get; private set; } + internal string OnRawCondition { get; private set; } + + public TypedScopeJoinBuilder OnSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + OnSqlPredicate = predicate; + OnRawCondition = null; + return this; + } + + public TypedScopeJoinBuilder OnRaw(string condition) + { + if (string.IsNullOrEmpty(condition)) + throw new ArgumentNullException("condition"); + OnRawCondition = condition.Trim(); + OnSqlPredicate = null; + return this; + } + } + + public sealed class TypedScopeJoinBuilder : TypedScopeJoinBuilderBase> + { + internal Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> OnSqlPredicate { get; private set; } + internal string OnRawCondition { get; private set; } + + public TypedScopeJoinBuilder OnSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + OnSqlPredicate = predicate; + OnRawCondition = null; + return this; + } + + public TypedScopeJoinBuilder OnRaw(string condition) + { + if (string.IsNullOrEmpty(condition)) + throw new ArgumentNullException("condition"); + OnRawCondition = condition.Trim(); + OnSqlPredicate = null; + return this; + } + } + + public sealed class TypedScopeJoinBuilder : TypedScopeJoinBuilderBase> + { + internal Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> OnSqlPredicate { get; private set; } + internal string OnRawCondition { get; private set; } + + public TypedScopeJoinBuilder OnSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + OnSqlPredicate = predicate; + OnRawCondition = null; + return this; + } + + public TypedScopeJoinBuilder OnRaw(string condition) + { + if (string.IsNullOrEmpty(condition)) + throw new ArgumentNullException("condition"); + OnRawCondition = condition.Trim(); + OnSqlPredicate = null; + return this; + } + } + + public sealed class TypedScopeJoinBuilder : TypedScopeJoinBuilderBase> + { + internal Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> OnSqlPredicate { get; private set; } + internal string OnRawCondition { get; private set; } + + public TypedScopeJoinBuilder OnSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + OnSqlPredicate = predicate; + OnRawCondition = null; + return this; + } + + public TypedScopeJoinBuilder OnRaw(string condition) + { + if (string.IsNullOrEmpty(condition)) + throw new ArgumentNullException("condition"); + OnRawCondition = condition.Trim(); + OnSqlPredicate = null; + return this; + } + } + + public sealed class TypedScopeJoinBuilder : TypedScopeJoinBuilderBase> + { + internal Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> OnSqlPredicate { get; private set; } + internal string OnRawCondition { get; private set; } + + public TypedScopeJoinBuilder OnSql(Func, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedTableContext, TypedSqlPredicate> predicate) + { + if (predicate == null) + throw new ArgumentNullException("predicate"); + OnSqlPredicate = predicate; + OnRawCondition = null; + return this; + } + + public TypedScopeJoinBuilder OnRaw(string condition) + { + if (string.IsNullOrEmpty(condition)) + throw new ArgumentNullException("condition"); + OnRawCondition = condition.Trim(); + OnSqlPredicate = null; + return this; + } + } + +} \ No newline at end of file