diff --git a/AmalgamationTool/DynamORM.Amalgamation.cs b/AmalgamationTool/DynamORM.Amalgamation.cs
index 212eb91..1109c46 100644
--- a/AmalgamationTool/DynamORM.Amalgamation.cs
+++ b/AmalgamationTool/DynamORM.Amalgamation.cs
@@ -7226,6 +7226,9 @@ namespace DynamORM
/// Add typed SQL DSL insert assignment.
IDynamicTypedInsertQueryBuilder InsertSql(Expression> selector, Func, TypedSqlExpression> valueFactory);
+
+ /// Add typed SQL DSL insert assignments from object projection.
+ IDynamicTypedInsertQueryBuilder InsertSql(Func, object> values);
}
/// Typed select query builder for mapped entities.
/// Mapped entity type.
@@ -7327,6 +7330,9 @@ namespace DynamORM
/// Add typed SQL DSL assignment.
IDynamicTypedUpdateQueryBuilder SetSql(Expression> selector, Func, TypedSqlExpression> valueFactory);
+
+ /// Add typed SQL DSL assignments from object projection.
+ IDynamicTypedUpdateQueryBuilder SetSql(Func, object> values);
}
/// Dynamic update query builder interface.
/// This interface it publicly available. Implementation should be hidden.
@@ -10724,7 +10730,7 @@ namespace DynamORM
}
public IDynamicTypedDeleteQueryBuilder WhereSql(Func, TypedSqlPredicate> predicate)
{
- string condition = TypedModifyHelper.RenderPredicate(predicate, null, RenderValue, Database.DecorateName);
+ string condition = TypedModifyHelper.RenderPredicate(predicate, null, RenderValue, Database.DecorateName, RenderSubQuery);
if (string.IsNullOrEmpty(WhereCondition))
WhereCondition = condition;
else
@@ -10765,6 +10771,14 @@ namespace DynamORM
DynamicSchemaColumn? columnSchema = null;
return ParseConstant(value, Parameters, columnSchema);
}
+ private string RenderSubQuery(Builders.IDynamicSelectQueryBuilder query)
+ {
+ foreach (KeyValuePair item in query.Parameters)
+ if (!Parameters.ContainsKey(item.Key))
+ Parameters.Add(item.Key, item.Value);
+
+ return query.CommandText();
+ }
}
/// Typed wrapper over with property-to-column translation.
/// Mapped entity type.
@@ -10795,12 +10809,30 @@ namespace DynamORM
public IDynamicTypedInsertQueryBuilder InsertSql(Expression> selector, Func, TypedSqlExpression> valueFactory)
{
string column = FixObjectName(TypedModifyHelper.GetMappedColumn(selector), onlyColumn: true);
- string value = TypedModifyHelper.RenderExpression(valueFactory, null, RenderValue, Database.DecorateName);
+ string value = TypedModifyHelper.RenderExpression(valueFactory, null, RenderValue, Database.DecorateName, RenderSubQuery);
_columns = _columns == null ? column : string.Format("{0}, {1}", _columns, column);
_values = _values == null ? value : string.Format("{0}, {1}", _values, value);
return this;
}
+ public IDynamicTypedInsertQueryBuilder InsertSql(Func, object> values)
+ {
+ if (values == null)
+ throw new ArgumentNullException("values");
+
+ object data = values(new TypedTableContext(null));
+ foreach (KeyValuePair item in data.ToDictionary())
+ {
+ string column = FixObjectName(TypedModifyHelper.GetMappedColumnByName(typeof(T), item.Key), onlyColumn: true);
+ string value = (item.Value as TypedSqlExpression) != null
+ ? TypedModifyHelper.RenderExpression(u => (TypedSqlExpression)item.Value, null, RenderValue, Database.DecorateName, RenderSubQuery)
+ : RenderValue(item.Value);
+
+ _columns = _columns == null ? column : string.Format("{0}, {1}", _columns, column);
+ _values = _values == null ? value : string.Format("{0}, {1}", _values, value);
+ }
+ return this;
+ }
public new IDynamicTypedInsertQueryBuilder Values(Func fn, params Func[] func)
{
base.Values(fn, func);
@@ -10824,6 +10856,14 @@ namespace DynamORM
DynamicSchemaColumn? columnSchema = null;
return ParseConstant(value, Parameters, columnSchema);
}
+ private string RenderSubQuery(Builders.IDynamicSelectQueryBuilder query)
+ {
+ foreach (KeyValuePair item in query.Parameters)
+ if (!Parameters.ContainsKey(item.Key))
+ Parameters.Add(item.Key, item.Value);
+
+ return query.CommandText();
+ }
}
/// Typed wrapper over with property-to-column translation.
/// Mapped entity type.
@@ -10863,6 +10903,17 @@ namespace DynamORM
{
return _builder.Database.DecorateName(name);
}
+ public string RenderSubQuery(IDynamicSelectQueryBuilder query)
+ {
+ if (query == null)
+ throw new ArgumentNullException("query");
+
+ foreach (var item in query.Parameters)
+ if (!_builder.Parameters.ContainsKey(item.Key))
+ _builder.Parameters.Add(item.Key, item.Value);
+
+ return query.CommandText();
+ }
}
private readonly DynamicTypeMap _mapper;
@@ -11633,7 +11684,7 @@ namespace DynamORM
}
public IDynamicTypedUpdateQueryBuilder WhereSql(Func, TypedSqlPredicate> predicate)
{
- string condition = TypedModifyHelper.RenderPredicate(predicate, null, RenderValue, Database.DecorateName);
+ string condition = TypedModifyHelper.RenderPredicate(predicate, null, RenderValue, Database.DecorateName, RenderSubQuery);
if (string.IsNullOrEmpty(WhereCondition))
WhereCondition = condition;
else
@@ -11644,11 +11695,29 @@ namespace DynamORM
public IDynamicTypedUpdateQueryBuilder SetSql(Expression> selector, Func, TypedSqlExpression> valueFactory)
{
string column = FixObjectName(TypedModifyHelper.GetMappedColumn(selector), onlyColumn: true);
- string value = TypedModifyHelper.RenderExpression(valueFactory, null, RenderValue, Database.DecorateName);
+ string value = TypedModifyHelper.RenderExpression(valueFactory, null, RenderValue, Database.DecorateName, RenderSubQuery);
string assignment = string.Format("{0} = {1}", column, value);
_columns = _columns == null ? assignment : string.Format("{0}, {1}", _columns, assignment);
return this;
}
+ public IDynamicTypedUpdateQueryBuilder SetSql(Func, object> values)
+ {
+ if (values == null)
+ throw new ArgumentNullException("values");
+
+ object data = values(new TypedTableContext(null));
+ foreach (KeyValuePair item in data.ToDictionary())
+ {
+ string column = FixObjectName(TypedModifyHelper.GetMappedColumnByName(typeof(T), item.Key), onlyColumn: true);
+ string value = (item.Value as TypedSqlExpression) != null
+ ? TypedModifyHelper.RenderExpression(u => (TypedSqlExpression)item.Value, null, RenderValue, Database.DecorateName, RenderSubQuery)
+ : RenderValue(item.Value);
+
+ string assignment = string.Format("{0} = {1}", column, value);
+ _columns = _columns == null ? assignment : string.Format("{0}, {1}", _columns, assignment);
+ }
+ return this;
+ }
public new IDynamicTypedUpdateQueryBuilder Update(string column, object value)
{
base.Update(column, value);
@@ -11707,6 +11776,14 @@ namespace DynamORM
DynamicSchemaColumn? columnSchema = null;
return ParseConstant(value, Parameters, columnSchema);
}
+ private string RenderSubQuery(Builders.IDynamicSelectQueryBuilder query)
+ {
+ foreach (KeyValuePair item in query.Parameters)
+ if (!Parameters.ContainsKey(item.Key))
+ Parameters.Add(item.Key, item.Value);
+
+ return query.CommandText();
+ }
}
/// Update query builder.
internal class DynamicUpdateQueryBuilder : DynamicModifyBuilder, IDynamicUpdateQueryBuilder, DynamicQueryBuilder.IQueryWithWhere
@@ -11996,12 +12073,14 @@ namespace DynamORM
private readonly Func, string> _resolveColumn;
private readonly Func