This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -46,9 +46,9 @@ namespace DynamORM.Builders.Extensions
|
|||||||
if (func == null)
|
if (func == null)
|
||||||
throw new ArgumentNullException("Function cannot be null.");
|
throw new ArgumentNullException("Function cannot be null.");
|
||||||
|
|
||||||
using (var parser = DynamicParser.Parse(func))
|
using (DynamicParser parser = DynamicParser.Parse(func))
|
||||||
{
|
{
|
||||||
var result = parser.Result;
|
object result = parser.Result;
|
||||||
|
|
||||||
// If the expression result is string.
|
// If the expression result is string.
|
||||||
if (result is string)
|
if (result is string)
|
||||||
@@ -58,7 +58,7 @@ namespace DynamORM.Builders.Extensions
|
|||||||
else if (result is DynamicParser.Node)
|
else if (result is DynamicParser.Node)
|
||||||
{
|
{
|
||||||
// Or if it resolves to a dynamic node
|
// Or if it resolves to a dynamic node
|
||||||
var node = (DynamicParser.Node)result;
|
DynamicParser.Node node = (DynamicParser.Node)result;
|
||||||
|
|
||||||
string owner = null;
|
string owner = null;
|
||||||
string main = null;
|
string main = null;
|
||||||
@@ -89,7 +89,7 @@ namespace DynamORM.Builders.Extensions
|
|||||||
{
|
{
|
||||||
if (owner == null && main == null)
|
if (owner == null && main == null)
|
||||||
{
|
{
|
||||||
var invoke = (DynamicParser.Node.Invoke)node;
|
DynamicParser.Node.Invoke invoke = (DynamicParser.Node.Invoke)node;
|
||||||
|
|
||||||
if (invoke.Arguments.Length == 1 && invoke.Arguments[0] is Type)
|
if (invoke.Arguments.Length == 1 && invoke.Arguments[0] is Type)
|
||||||
return builder.Table((Type)invoke.Arguments[0]);
|
return builder.Table((Type)invoke.Arguments[0]);
|
||||||
@@ -117,12 +117,12 @@ namespace DynamORM.Builders.Extensions
|
|||||||
|
|
||||||
internal static T Table<T>(this T builder, string tableName, Dictionary<string, DynamicSchemaColumn> schema = null) where T : DynamicModifyBuilder
|
internal static T Table<T>(this T builder, string tableName, Dictionary<string, DynamicSchemaColumn> schema = null) where T : DynamicModifyBuilder
|
||||||
{
|
{
|
||||||
var tuple = tableName.Validated("Table Name").SplitSomethingAndAlias();
|
Tuple<string, string> tuple = tableName.Validated("Table Name").SplitSomethingAndAlias();
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(tuple.Item2))
|
if (!string.IsNullOrEmpty(tuple.Item2))
|
||||||
throw new ArgumentException(string.Format("Can not use aliases in INSERT steatement. ({0})", tableName), "tableName");
|
throw new ArgumentException(string.Format("Can not use aliases in INSERT steatement. ({0})", tableName), "tableName");
|
||||||
|
|
||||||
var parts = tuple.Item1.Split('.');
|
string[] parts = tuple.Item1.Split('.');
|
||||||
|
|
||||||
if (parts.Length > 2)
|
if (parts.Length > 2)
|
||||||
throw new ArgumentException(string.Format("Table name can consist only from name or owner and name. ({0})", tableName), "tableName");
|
throw new ArgumentException(string.Format("Table name can consist only from name or owner and name. ({0})", tableName), "tableName");
|
||||||
@@ -143,7 +143,7 @@ namespace DynamORM.Builders.Extensions
|
|||||||
if (type.IsAnonymous())
|
if (type.IsAnonymous())
|
||||||
throw new InvalidOperationException(string.Format("Cant assign anonymous type as a table ({0}).", type.FullName));
|
throw new InvalidOperationException(string.Format("Cant assign anonymous type as a table ({0}).", type.FullName));
|
||||||
|
|
||||||
var mapper = DynamicMapperCache.GetMapper(type);
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(type);
|
||||||
|
|
||||||
if (mapper == null)
|
if (mapper == null)
|
||||||
throw new InvalidOperationException("Cant assign unmapable type as a table.");
|
throw new InvalidOperationException("Cant assign unmapable type as a table.");
|
||||||
|
|||||||
@@ -51,12 +51,12 @@ namespace DynamORM.Builders.Extensions
|
|||||||
{
|
{
|
||||||
if (func == null) throw new ArgumentNullException("Array of functions cannot be null.");
|
if (func == null) throw new ArgumentNullException("Array of functions cannot be null.");
|
||||||
|
|
||||||
using (var parser = DynamicParser.Parse(func))
|
using (DynamicParser parser = DynamicParser.Parse(func))
|
||||||
{
|
{
|
||||||
string condition = null;
|
string condition = null;
|
||||||
bool and = true;
|
bool and = true;
|
||||||
|
|
||||||
var result = parser.Result;
|
object result = parser.Result;
|
||||||
if (result is string)
|
if (result is string)
|
||||||
{
|
{
|
||||||
condition = (string)result;
|
condition = (string)result;
|
||||||
@@ -76,8 +76,8 @@ namespace DynamORM.Builders.Extensions
|
|||||||
// Intercepting the 'x => x.And()' and 'x => x.Or()' virtual methods...
|
// Intercepting the 'x => x.And()' and 'x => x.Or()' virtual methods...
|
||||||
if (result is DynamicParser.Node.Method && ((DynamicParser.Node.Method)result).Host is DynamicParser.Node.Argument)
|
if (result is DynamicParser.Node.Method && ((DynamicParser.Node.Method)result).Host is DynamicParser.Node.Argument)
|
||||||
{
|
{
|
||||||
var node = (DynamicParser.Node.Method)result;
|
DynamicParser.Node.Method node = (DynamicParser.Node.Method)result;
|
||||||
var name = node.Name.ToUpper();
|
string name = node.Name.ToUpper();
|
||||||
if (name == "AND" || name == "OR")
|
if (name == "AND" || name == "OR")
|
||||||
{
|
{
|
||||||
object[] args = ((DynamicParser.Node.Method)node).Arguments;
|
object[] args = ((DynamicParser.Node.Method)node).Arguments;
|
||||||
@@ -166,7 +166,7 @@ namespace DynamORM.Builders.Extensions
|
|||||||
{
|
{
|
||||||
if (value is DynamicColumn)
|
if (value is DynamicColumn)
|
||||||
{
|
{
|
||||||
var v = (DynamicColumn)value;
|
DynamicColumn v = (DynamicColumn)value;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(v.ColumnName))
|
if (string.IsNullOrEmpty(v.ColumnName))
|
||||||
v.ColumnName = column;
|
v.ColumnName = column;
|
||||||
@@ -206,11 +206,11 @@ namespace DynamORM.Builders.Extensions
|
|||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
var dict = conditions.ToDictionary();
|
IDictionary<string, object> dict = conditions.ToDictionary();
|
||||||
var mapper = DynamicMapperCache.GetMapper(conditions.GetType());
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(conditions.GetType());
|
||||||
var table = dict.TryGetValue("_table").NullOr(x => x.ToString(), string.Empty);
|
string table = dict.TryGetValue("_table").NullOr(x => x.ToString(), string.Empty);
|
||||||
|
|
||||||
foreach (var condition in dict)
|
foreach (KeyValuePair<string, object> condition in dict)
|
||||||
{
|
{
|
||||||
if (mapper.Ignored.Contains(condition.Key) || condition.Key == "_table")
|
if (mapper.Ignored.Contains(condition.Key) || condition.Key == "_table")
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
/// <remarks>This method must be override by derived classes.</remarks>
|
/// <remarks>This method must be override by derived classes.</remarks>
|
||||||
public override string CommandText()
|
public override string CommandText()
|
||||||
{
|
{
|
||||||
var info = Tables.Single();
|
ITableInfo info = Tables.Single();
|
||||||
return string.Format("DELETE FROM {0}{1}{2}{3}",
|
return string.Format("DELETE FROM {0}{1}{2}{3}",
|
||||||
string.IsNullOrEmpty(info.Owner) ? string.Empty : string.Format("{0}.", Database.DecorateName(info.Owner)),
|
string.IsNullOrEmpty(info.Owner) ? string.Empty : string.Format("{0}.", Database.DecorateName(info.Owner)),
|
||||||
Database.DecorateName(info.Name),
|
Database.DecorateName(info.Name),
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using DynamORM.Helpers.Dynamics;
|
using DynamORM.Helpers.Dynamics;
|
||||||
using DynamORM.Mapper;
|
using DynamORM.Mapper;
|
||||||
@@ -66,7 +67,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
/// <remarks>This method must be override by derived classes.</remarks>
|
/// <remarks>This method must be override by derived classes.</remarks>
|
||||||
public override string CommandText()
|
public override string CommandText()
|
||||||
{
|
{
|
||||||
var info = Tables.Single();
|
ITableInfo info = Tables.Single();
|
||||||
return string.Format("INSERT INTO {0}{1} ({2}) VALUES ({3})",
|
return string.Format("INSERT INTO {0}{1} ({2}) VALUES ({3})",
|
||||||
string.IsNullOrEmpty(info.Owner) ? string.Empty : string.Format("{0}.", Database.DecorateName(info.Owner)),
|
string.IsNullOrEmpty(info.Owner) ? string.Empty : string.Format("{0}.", Database.DecorateName(info.Owner)),
|
||||||
Database.DecorateName(info.Name), _columns, _values);
|
Database.DecorateName(info.Name), _columns, _values);
|
||||||
@@ -91,7 +92,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
int index = InsertFunc(-1, fn);
|
int index = InsertFunc(-1, fn);
|
||||||
|
|
||||||
if (func != null)
|
if (func != null)
|
||||||
foreach (var f in func)
|
foreach (Func<dynamic, object> f in func)
|
||||||
index = InsertFunc(index, f);
|
index = InsertFunc(index, f);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
@@ -104,9 +105,9 @@ namespace DynamORM.Builders.Implementation
|
|||||||
if (f == null)
|
if (f == null)
|
||||||
throw new ArgumentNullException(string.Format("Specification #{0} cannot be null.", index));
|
throw new ArgumentNullException(string.Format("Specification #{0} cannot be null.", index));
|
||||||
|
|
||||||
using (var parser = DynamicParser.Parse(f))
|
using (DynamicParser parser = DynamicParser.Parse(f))
|
||||||
{
|
{
|
||||||
var result = parser.Result;
|
object result = parser.Result;
|
||||||
if (result == null)
|
if (result == null)
|
||||||
throw new ArgumentException(string.Format("Specification #{0} resolves to null.", index));
|
throw new ArgumentException(string.Format("Specification #{0} resolves to null.", index));
|
||||||
|
|
||||||
@@ -117,7 +118,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
// When 'x => x.Table.Column = value' or 'x => x.Column = value'...
|
// When 'x => x.Table.Column = value' or 'x => x.Column = value'...
|
||||||
if (result is DynamicParser.Node.SetMember)
|
if (result is DynamicParser.Node.SetMember)
|
||||||
{
|
{
|
||||||
var node = (DynamicParser.Node.SetMember)result;
|
DynamicParser.Node.SetMember node = (DynamicParser.Node.SetMember)result;
|
||||||
|
|
||||||
DynamicSchemaColumn? col = GetColumnFromSchema(node.Name);
|
DynamicSchemaColumn? col = GetColumnFromSchema(node.Name);
|
||||||
main = Database.DecorateName(node.Name);
|
main = Database.DecorateName(node.Name);
|
||||||
@@ -134,7 +135,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Other specifications are considered invalid...
|
// Other specifications are considered invalid...
|
||||||
var err = string.Format("Specification '{0}' is invalid.", result);
|
string err = string.Format("Specification '{0}' is invalid.", result);
|
||||||
str = Parse(result);
|
str = Parse(result);
|
||||||
if (str.Contains("=")) err += " May have you used a '==' instead of a '=' operator?";
|
if (str.Contains("=")) err += " May have you used a '==' instead of a '=' operator?";
|
||||||
throw new ArgumentException(err);
|
throw new ArgumentException(err);
|
||||||
@@ -149,7 +150,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
{
|
{
|
||||||
if (value is DynamicColumn)
|
if (value is DynamicColumn)
|
||||||
{
|
{
|
||||||
var v = (DynamicColumn)value;
|
DynamicColumn v = (DynamicColumn)value;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(v.ColumnName))
|
if (string.IsNullOrEmpty(v.ColumnName))
|
||||||
v.ColumnName = column;
|
v.ColumnName = column;
|
||||||
@@ -171,7 +172,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
{
|
{
|
||||||
if (o is DynamicColumn)
|
if (o is DynamicColumn)
|
||||||
{
|
{
|
||||||
var column = (DynamicColumn)o;
|
DynamicColumn column = (DynamicColumn)o;
|
||||||
DynamicSchemaColumn? col = column.Schema ?? GetColumnFromSchema(column.ColumnName);
|
DynamicSchemaColumn? col = column.Schema ?? GetColumnFromSchema(column.ColumnName);
|
||||||
|
|
||||||
string main = FixObjectName(column.ColumnName, onlyColumn: true);
|
string main = FixObjectName(column.ColumnName, onlyColumn: true);
|
||||||
@@ -183,23 +184,23 @@ namespace DynamORM.Builders.Implementation
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
var dict = o.ToDictionary();
|
IDictionary<string, object> dict = o.ToDictionary();
|
||||||
var mapper = DynamicMapperCache.GetMapper(o.GetType());
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(o.GetType());
|
||||||
|
|
||||||
if (mapper != null)
|
if (mapper != null)
|
||||||
{
|
{
|
||||||
foreach (var con in dict)
|
foreach (KeyValuePair<string, object> con in dict)
|
||||||
if (!mapper.Ignored.Contains(con.Key))
|
if (!mapper.Ignored.Contains(con.Key))
|
||||||
{
|
{
|
||||||
var colName = mapper.PropertyMap.TryGetValue(con.Key) ?? con.Key;
|
string colName = mapper.PropertyMap.TryGetValue(con.Key) ?? con.Key;
|
||||||
var propMap = mapper.ColumnsMap.TryGetValue(colName.ToLower());
|
DynamicPropertyInvoker propMap = mapper.ColumnsMap.TryGetValue(colName.ToLower());
|
||||||
|
|
||||||
if (propMap == null || propMap.Column == null || !propMap.Column.IsNoInsert)
|
if (propMap == null || propMap.Column == null || !propMap.Column.IsNoInsert)
|
||||||
Insert(colName, con.Value);
|
Insert(colName, con.Value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
foreach (var con in dict)
|
foreach (KeyValuePair<string, object> con in dict)
|
||||||
Insert(con.Key, con.Value);
|
Insert(con.Key, con.Value);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
using System.Data;
|
||||||
using DynamORM.Builders.Extensions;
|
using DynamORM.Builders.Extensions;
|
||||||
|
|
||||||
namespace DynamORM.Builders.Implementation
|
namespace DynamORM.Builders.Implementation
|
||||||
@@ -59,8 +60,8 @@ namespace DynamORM.Builders.Implementation
|
|||||||
/// <returns>Result of an execution..</returns>
|
/// <returns>Result of an execution..</returns>
|
||||||
public virtual int Execute()
|
public virtual int Execute()
|
||||||
{
|
{
|
||||||
using (var con = Database.Open())
|
using (IDbConnection con = Database.Open())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
{
|
{
|
||||||
return cmd
|
return cmd
|
||||||
.SetCommand(this)
|
.SetCommand(this)
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
public TableInfo(DynamicDatabase db, Type type, string alias = null, string owner = null)
|
public TableInfo(DynamicDatabase db, Type type, string alias = null, string owner = null)
|
||||||
: this()
|
: this()
|
||||||
{
|
{
|
||||||
var mapper = DynamicMapperCache.GetMapper(type);
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(type);
|
||||||
|
|
||||||
Name = mapper.Table == null || string.IsNullOrEmpty(mapper.Table.Name) ?
|
Name = mapper.Table == null || string.IsNullOrEmpty(mapper.Table.Name) ?
|
||||||
mapper.Type.Name : mapper.Table.Name;
|
mapper.Type.Name : mapper.Table.Name;
|
||||||
@@ -371,7 +371,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
// If node is a delegate, parse it to create the logical tree...
|
// If node is a delegate, parse it to create the logical tree...
|
||||||
if (node is Delegate)
|
if (node is Delegate)
|
||||||
{
|
{
|
||||||
using (var p = DynamicParser.Parse((Delegate)node))
|
using (DynamicParser p = DynamicParser.Parse((Delegate)node))
|
||||||
node = p.Result;
|
node = p.Result;
|
||||||
|
|
||||||
return Parse(node, ref columnSchema, pars, rawstr, decorate: decorate); // Intercept containers as in (x => "string")
|
return Parse(node, ref columnSchema, pars, rawstr, decorate: decorate); // Intercept containers as in (x => "string")
|
||||||
@@ -409,7 +409,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
throw new InvalidOperationException(string.Format("The parameters in this command '{0}' cannot be added to a null collection.", node.Parameters));
|
throw new InvalidOperationException(string.Format("The parameters in this command '{0}' cannot be added to a null collection.", node.Parameters));
|
||||||
|
|
||||||
// Copy parameters to new comand
|
// Copy parameters to new comand
|
||||||
foreach (var parameter in node.Parameters)
|
foreach (KeyValuePair<string, IParameter> parameter in node.Parameters)
|
||||||
pars.Add(parameter.Key, parameter.Value);
|
pars.Add(parameter.Key, parameter.Value);
|
||||||
|
|
||||||
return string.Format("({0})", str);
|
return string.Format("({0})", str);
|
||||||
@@ -574,11 +574,11 @@ namespace DynamORM.Builders.Implementation
|
|||||||
if (node.Arguments.Length > 2)
|
if (node.Arguments.Length > 2)
|
||||||
throw new ArgumentException("BETWEEN method expects at most two arguments: " + node.Arguments.Sketch());
|
throw new ArgumentException("BETWEEN method expects at most two arguments: " + node.Arguments.Sketch());
|
||||||
|
|
||||||
var arguments = node.Arguments;
|
object[] arguments = node.Arguments;
|
||||||
|
|
||||||
if (arguments.Length == 1 && (arguments[0] is IEnumerable<object> || arguments[0] is Array) && !(arguments[0] is byte[]))
|
if (arguments.Length == 1 && (arguments[0] is IEnumerable<object> || arguments[0] is Array) && !(arguments[0] is byte[]))
|
||||||
{
|
{
|
||||||
var vals = arguments[0] as IEnumerable<object>;
|
IEnumerable<object> vals = arguments[0] as IEnumerable<object>;
|
||||||
|
|
||||||
if (vals == null && arguments[0] is Array)
|
if (vals == null && arguments[0] is Array)
|
||||||
vals = ((Array)arguments[0]).Cast<object>() as IEnumerable<object>;
|
vals = ((Array)arguments[0]).Cast<object>() as IEnumerable<object>;
|
||||||
@@ -599,20 +599,20 @@ namespace DynamORM.Builders.Implementation
|
|||||||
|
|
||||||
bool firstParam = true;
|
bool firstParam = true;
|
||||||
StringBuilder sbin = new StringBuilder();
|
StringBuilder sbin = new StringBuilder();
|
||||||
foreach (var arg in node.Arguments)
|
foreach (object arg in node.Arguments)
|
||||||
{
|
{
|
||||||
if (!firstParam)
|
if (!firstParam)
|
||||||
sbin.Append(", ");
|
sbin.Append(", ");
|
||||||
|
|
||||||
if ((arg is IEnumerable<object> || arg is Array) && !(arg is byte[]))
|
if ((arg is IEnumerable<object> || arg is Array) && !(arg is byte[]))
|
||||||
{
|
{
|
||||||
var vals = arg as IEnumerable<object>;
|
IEnumerable<object> vals = arg as IEnumerable<object>;
|
||||||
|
|
||||||
if (vals == null && arg is Array)
|
if (vals == null && arg is Array)
|
||||||
vals = ((Array)arg).Cast<object>() as IEnumerable<object>;
|
vals = ((Array)arg).Cast<object>() as IEnumerable<object>;
|
||||||
|
|
||||||
if (vals != null)
|
if (vals != null)
|
||||||
foreach (var val in vals)
|
foreach (object val in vals)
|
||||||
{
|
{
|
||||||
if (!firstParam)
|
if (!firstParam)
|
||||||
sbin.Append(", ");
|
sbin.Append(", ");
|
||||||
@@ -729,7 +729,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
bool wellKnownName = VirtualMode && node is String && ((String)node).StartsWith("[$") && ((String)node).EndsWith("]") && ((String)node).Length > 4;
|
bool wellKnownName = VirtualMode && node is String && ((String)node).StartsWith("[$") && ((String)node).EndsWith("]") && ((String)node).Length > 4;
|
||||||
|
|
||||||
// If we have a list of parameters to store it, let's parametrize it
|
// If we have a list of parameters to store it, let's parametrize it
|
||||||
var par = new Parameter()
|
Parameter par = new Parameter()
|
||||||
{
|
{
|
||||||
Name = wellKnownName ? ((String)node).Substring(2, ((String)node).Length - 3) : Guid.NewGuid().ToString(),
|
Name = wellKnownName ? ((String)node).Substring(2, ((String)node).Length - 3) : Guid.NewGuid().ToString(),
|
||||||
Value = wellKnownName ? null : node,
|
Value = wellKnownName ? null : node,
|
||||||
@@ -801,7 +801,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
|
|
||||||
private string FixObjectNamePrivate(string f, bool onlyColumn = false)
|
private string FixObjectNamePrivate(string f, bool onlyColumn = false)
|
||||||
{
|
{
|
||||||
var objects = f.Split('.')
|
IEnumerable<string> objects = f.Split('.')
|
||||||
.Select(x => Database.StripName(x));
|
.Select(x => Database.StripName(x));
|
||||||
|
|
||||||
if (onlyColumn || objects.Count() == 1)
|
if (onlyColumn || objects.Count() == 1)
|
||||||
@@ -821,11 +821,11 @@ namespace DynamORM.Builders.Implementation
|
|||||||
//// return null;
|
//// return null;
|
||||||
|
|
||||||
// First we need to get real column name and it's owner if exist.
|
// First we need to get real column name and it's owner if exist.
|
||||||
var parts = colName.Split('.');
|
string[] parts = colName.Split('.');
|
||||||
for (int i = 0; i < parts.Length; i++)
|
for (int i = 0; i < parts.Length; i++)
|
||||||
parts[i] = Database.StripName(parts[i]);
|
parts[i] = Database.StripName(parts[i]);
|
||||||
|
|
||||||
var columnName = parts.Last();
|
string columnName = parts.Last();
|
||||||
|
|
||||||
// Get table name from mapper
|
// Get table name from mapper
|
||||||
string tableName = table;
|
string tableName = table;
|
||||||
@@ -842,7 +842,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Try to get table info from cache
|
// Try to get table info from cache
|
||||||
var tableInfo = !string.IsNullOrEmpty(tableName) ?
|
ITableInfo tableInfo = !string.IsNullOrEmpty(tableName) ?
|
||||||
Tables.FirstOrDefault(x => !string.IsNullOrEmpty(x.Alias) && x.Alias.ToLower() == tableName) ??
|
Tables.FirstOrDefault(x => !string.IsNullOrEmpty(x.Alias) && x.Alias.ToLower() == tableName) ??
|
||||||
Tables.FirstOrDefault(x => x.Name.ToLower() == tableName.ToLower()) ?? Tables.FirstOrDefault() :
|
Tables.FirstOrDefault(x => x.Name.ToLower() == tableName.ToLower()) ?? Tables.FirstOrDefault() :
|
||||||
this is DynamicModifyBuilder ? Tables.FirstOrDefault() : null;
|
this is DynamicModifyBuilder ? Tables.FirstOrDefault() : null;
|
||||||
@@ -873,7 +873,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
|
|
||||||
if (Parameters != null)
|
if (Parameters != null)
|
||||||
{
|
{
|
||||||
foreach (var p in Parameters)
|
foreach (KeyValuePair<string, IParameter> p in Parameters)
|
||||||
p.Value.Dispose();
|
p.Value.Dispose();
|
||||||
|
|
||||||
Parameters.Clear();
|
Parameters.Clear();
|
||||||
@@ -882,7 +882,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
|
|
||||||
if (Tables != null)
|
if (Tables != null)
|
||||||
{
|
{
|
||||||
foreach (var t in Tables)
|
foreach (ITableInfo t in Tables)
|
||||||
t.Dispose();
|
t.Dispose();
|
||||||
|
|
||||||
Tables.Clear();
|
Tables.Clear();
|
||||||
|
|||||||
@@ -100,48 +100,6 @@ namespace DynamORM.Builders.Implementation
|
|||||||
|
|
||||||
#region Execution
|
#region Execution
|
||||||
|
|
||||||
/*/// <summary>Execute this builder.</summary>
|
|
||||||
|
|
||||||
/// <returns>Enumerator of objects expanded from query.</returns>
|
|
||||||
public virtual IEnumerator<dynamic> GetEnumerator()
|
|
||||||
{
|
|
||||||
using (var con = Database.Open())
|
|
||||||
using (var cmd = con.CreateCommand())
|
|
||||||
{
|
|
||||||
using (var rdr = cmd
|
|
||||||
.SetCommand(this)
|
|
||||||
.ExecuteReader())
|
|
||||||
while (rdr.Read())
|
|
||||||
{
|
|
||||||
dynamic val = null;
|
|
||||||
|
|
||||||
// Work around to avoid yield being in try...catchblock:
|
|
||||||
// http://stackoverflow.com/questions/346365/why-cant-yield-return-appear-inside-a-try-block-with-a-catch
|
|
||||||
try
|
|
||||||
{
|
|
||||||
val = rdr.RowToDynamic();
|
|
||||||
}
|
|
||||||
catch (ArgumentException argex)
|
|
||||||
{
|
|
||||||
var sb = new StringBuilder();
|
|
||||||
cmd.Dump(sb);
|
|
||||||
|
|
||||||
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
|
|
||||||
argex.InnerException.NullOr(a => a, argex));
|
|
||||||
}
|
|
||||||
|
|
||||||
yield return val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>Execute this builder.</summary>
|
|
||||||
/// <returns>Enumerator of objects expanded from query.</returns>
|
|
||||||
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
|
|
||||||
{
|
|
||||||
return GetEnumerator();
|
|
||||||
}*/
|
|
||||||
|
|
||||||
/// <summary>Execute this builder.</summary>
|
/// <summary>Execute this builder.</summary>
|
||||||
/// <returns>Enumerator of objects expanded from query.</returns>
|
/// <returns>Enumerator of objects expanded from query.</returns>
|
||||||
public virtual IEnumerable<dynamic> Execute()
|
public virtual IEnumerable<dynamic> Execute()
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using DynamORM.Builders.Extensions;
|
using DynamORM.Builders.Extensions;
|
||||||
using DynamORM.Helpers.Dynamics;
|
using DynamORM.Helpers.Dynamics;
|
||||||
@@ -57,7 +58,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
/// <remarks>This method must be override by derived classes.</remarks>
|
/// <remarks>This method must be override by derived classes.</remarks>
|
||||||
public override string CommandText()
|
public override string CommandText()
|
||||||
{
|
{
|
||||||
var info = Tables.Single();
|
ITableInfo info = Tables.Single();
|
||||||
return string.Format("UPDATE {0}{1} SET {2}{3}{4}",
|
return string.Format("UPDATE {0}{1} SET {2}{3}{4}",
|
||||||
string.IsNullOrEmpty(info.Owner) ? string.Empty : string.Format("{0}.", Database.DecorateName(info.Owner)),
|
string.IsNullOrEmpty(info.Owner) ? string.Empty : string.Format("{0}.", Database.DecorateName(info.Owner)),
|
||||||
Database.DecorateName(info.Name), _columns,
|
Database.DecorateName(info.Name), _columns,
|
||||||
@@ -93,7 +94,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
{
|
{
|
||||||
if (conditions is DynamicColumn)
|
if (conditions is DynamicColumn)
|
||||||
{
|
{
|
||||||
var column = (DynamicColumn)conditions;
|
DynamicColumn column = (DynamicColumn)conditions;
|
||||||
|
|
||||||
DynamicSchemaColumn? col = column.Schema ?? GetColumnFromSchema(column.ColumnName);
|
DynamicSchemaColumn? col = column.Schema ?? GetColumnFromSchema(column.ColumnName);
|
||||||
|
|
||||||
@@ -108,10 +109,10 @@ namespace DynamORM.Builders.Implementation
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
var dict = conditions.ToDictionary();
|
IDictionary<string, object> dict = conditions.ToDictionary();
|
||||||
var mapper = DynamicMapperCache.GetMapper(conditions.GetType());
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(conditions.GetType());
|
||||||
|
|
||||||
foreach (var con in dict)
|
foreach (KeyValuePair<string, object> con in dict)
|
||||||
{
|
{
|
||||||
if (mapper.Ignored.Contains(con.Key))
|
if (mapper.Ignored.Contains(con.Key))
|
||||||
continue;
|
continue;
|
||||||
@@ -134,7 +135,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var propMap = mapper.ColumnsMap.TryGetValue(colName.ToLower());
|
DynamicPropertyInvoker propMap = mapper.ColumnsMap.TryGetValue(colName.ToLower());
|
||||||
if (propMap == null || propMap.Column == null || !propMap.Column.IsNoUpdate)
|
if (propMap == null || propMap.Column == null || !propMap.Column.IsNoUpdate)
|
||||||
Values(colName, con.Value);
|
Values(colName, con.Value);
|
||||||
}
|
}
|
||||||
@@ -160,7 +161,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
throw new ArgumentNullException("Array of specifications cannot be null.");
|
throw new ArgumentNullException("Array of specifications cannot be null.");
|
||||||
|
|
||||||
int index = -1;
|
int index = -1;
|
||||||
foreach (var f in func)
|
foreach (Func<dynamic, object> f in func)
|
||||||
{
|
{
|
||||||
index++;
|
index++;
|
||||||
if (f == null)
|
if (f == null)
|
||||||
@@ -168,7 +169,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
|
|
||||||
object result = null;
|
object result = null;
|
||||||
|
|
||||||
using (var p = DynamicParser.Parse(f))
|
using (DynamicParser p = DynamicParser.Parse(f))
|
||||||
result = p.Result;
|
result = p.Result;
|
||||||
|
|
||||||
if (result == null)
|
if (result == null)
|
||||||
@@ -181,7 +182,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
// When 'x => x.Table.Column = value' or 'x => x.Column = value'...
|
// When 'x => x.Table.Column = value' or 'x => x.Column = value'...
|
||||||
if (result is DynamicParser.Node.SetMember)
|
if (result is DynamicParser.Node.SetMember)
|
||||||
{
|
{
|
||||||
var node = (DynamicParser.Node.SetMember)result;
|
DynamicParser.Node.SetMember node = (DynamicParser.Node.SetMember)result;
|
||||||
|
|
||||||
DynamicSchemaColumn? col = GetColumnFromSchema(node.Name);
|
DynamicSchemaColumn? col = GetColumnFromSchema(node.Name);
|
||||||
main = Database.DecorateName(node.Name);
|
main = Database.DecorateName(node.Name);
|
||||||
@@ -198,7 +199,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Other specifications are considered invalid...
|
// Other specifications are considered invalid...
|
||||||
var err = string.Format("Specification '{0}' is invalid.", result);
|
string err = string.Format("Specification '{0}' is invalid.", result);
|
||||||
str = Parse(result);
|
str = Parse(result);
|
||||||
if (str.Contains("=")) err += " May have you used a '==' instead of a '=' operator?";
|
if (str.Contains("=")) err += " May have you used a '==' instead of a '=' operator?";
|
||||||
throw new ArgumentException(err);
|
throw new ArgumentException(err);
|
||||||
@@ -215,7 +216,7 @@ namespace DynamORM.Builders.Implementation
|
|||||||
{
|
{
|
||||||
if (value is DynamicColumn)
|
if (value is DynamicColumn)
|
||||||
{
|
{
|
||||||
var v = (DynamicColumn)value;
|
DynamicColumn v = (DynamicColumn)value;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(v.ColumnName))
|
if (string.IsNullOrEmpty(v.ColumnName))
|
||||||
v.ColumnName = column;
|
v.ColumnName = column;
|
||||||
@@ -237,29 +238,29 @@ namespace DynamORM.Builders.Implementation
|
|||||||
{
|
{
|
||||||
if (o is DynamicColumn)
|
if (o is DynamicColumn)
|
||||||
{
|
{
|
||||||
var column = (DynamicColumn)o;
|
DynamicColumn column = (DynamicColumn)o;
|
||||||
DynamicSchemaColumn? col = column.Schema ?? GetColumnFromSchema(column.ColumnName);
|
DynamicSchemaColumn? col = column.Schema ?? GetColumnFromSchema(column.ColumnName);
|
||||||
|
|
||||||
string main = FixObjectName(column.ColumnName, onlyColumn: true);
|
string main = FixObjectName(column.ColumnName, onlyColumn: true);
|
||||||
string value = Parse(column.Value, ref col, pars: Parameters, nulls: true);
|
string value = Parse(column.Value, ref col, pars: Parameters, nulls: true);
|
||||||
|
|
||||||
var str = string.Format("{0} = {1}", main, value);
|
string str = string.Format("{0} = {1}", main, value);
|
||||||
_columns = _columns == null ? str : string.Format("{0}, {1}", _columns, str);
|
_columns = _columns == null ? str : string.Format("{0}, {1}", _columns, str);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
var dict = o.ToDictionary();
|
IDictionary<string, object> dict = o.ToDictionary();
|
||||||
var mapper = DynamicMapperCache.GetMapper(o.GetType());
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(o.GetType());
|
||||||
|
|
||||||
if (mapper != null)
|
if (mapper != null)
|
||||||
{
|
{
|
||||||
foreach (var con in dict)
|
foreach (KeyValuePair<string, object> con in dict)
|
||||||
if (!mapper.Ignored.Contains(con.Key))
|
if (!mapper.Ignored.Contains(con.Key))
|
||||||
Values(mapper.PropertyMap.TryGetValue(con.Key) ?? con.Key, con.Value);
|
Values(mapper.PropertyMap.TryGetValue(con.Key) ?? con.Key, con.Value);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
foreach (var con in dict)
|
foreach (KeyValuePair<string, object> con in dict)
|
||||||
Values(con.Key, con.Value);
|
Values(con.Key, con.Value);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
|
|||||||
@@ -390,7 +390,7 @@ namespace DynamORM
|
|||||||
public static DynamicColumn ParseSelectColumn(string column)
|
public static DynamicColumn ParseSelectColumn(string column)
|
||||||
{
|
{
|
||||||
// Split column description
|
// Split column description
|
||||||
var parts = column.Split(':');
|
string[] parts = column.Split(':');
|
||||||
|
|
||||||
if (parts.Length > 0)
|
if (parts.Length > 0)
|
||||||
{
|
{
|
||||||
@@ -416,7 +416,7 @@ namespace DynamORM
|
|||||||
public static DynamicColumn ParseOrderByColumn(string column)
|
public static DynamicColumn ParseOrderByColumn(string column)
|
||||||
{
|
{
|
||||||
// Split column description
|
// Split column description
|
||||||
var parts = column.Split(':');
|
string[] parts = column.Split(':');
|
||||||
|
|
||||||
if (parts.Length > 0)
|
if (parts.Length > 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using DynamORM.Helpers;
|
using DynamORM.Helpers;
|
||||||
|
|
||||||
@@ -267,7 +268,7 @@ namespace DynamORM
|
|||||||
{
|
{
|
||||||
if (_con != null)
|
if (_con != null)
|
||||||
{
|
{
|
||||||
var pool = _db.CommandsPool.TryGetValue(_con.Connection);
|
List<IDbCommand> pool = _db.CommandsPool.TryGetValue(_con.Connection);
|
||||||
|
|
||||||
if (pool != null && pool.Contains(this))
|
if (pool != null && pool.Contains(this))
|
||||||
pool.Remove(this);
|
pool.Remove(this);
|
||||||
|
|||||||
@@ -122,6 +122,10 @@ namespace DynamORM
|
|||||||
/// dump commands to console or not.</summary>
|
/// dump commands to console or not.</summary>
|
||||||
public bool DumpCommands { get; set; }
|
public bool DumpCommands { get; set; }
|
||||||
|
|
||||||
|
/// <summary>Gets or sets the dump command delegate.</summary>
|
||||||
|
/// <value>The dump command delegate.</value>
|
||||||
|
public Action<IDbCommand, string> DumpCommandDelegate { get; set; }
|
||||||
|
|
||||||
/// <summary>Initializes a new instance of the <see cref="DynamicDatabase" /> class.</summary>
|
/// <summary>Initializes a new instance of the <see cref="DynamicDatabase" /> class.</summary>
|
||||||
/// <param name="provider">Database provider by name.</param>
|
/// <param name="provider">Database provider by name.</param>
|
||||||
/// <param name="connectionString">Connection string to provided database.</param>
|
/// <param name="connectionString">Connection string to provided database.</param>
|
||||||
@@ -245,7 +249,7 @@ namespace DynamORM
|
|||||||
/// <param name="dynamicTable">Disposed dynamic table.</param>
|
/// <param name="dynamicTable">Disposed dynamic table.</param>
|
||||||
internal void RemoveFromCache(DynamicTable dynamicTable)
|
internal void RemoveFromCache(DynamicTable dynamicTable)
|
||||||
{
|
{
|
||||||
foreach (var item in TablesCache.Where(kvp => kvp.Value == dynamicTable).ToList())
|
foreach (KeyValuePair<string, DynamicTable> item in TablesCache.Where(kvp => kvp.Value == dynamicTable).ToList())
|
||||||
TablesCache.Remove(item.Key);
|
TablesCache.Remove(item.Key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -341,27 +345,27 @@ namespace DynamORM
|
|||||||
public virtual int Insert<T>(IEnumerable<T> e) where T : class
|
public virtual int Insert<T>(IEnumerable<T> e) where T : class
|
||||||
{
|
{
|
||||||
int affected = 0;
|
int affected = 0;
|
||||||
var mapper = DynamicMapperCache.GetMapper(typeof(T));
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(typeof(T));
|
||||||
|
|
||||||
if (mapper != null)
|
if (mapper != null)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var tra = con.BeginTransaction())
|
using (IDbTransaction tra = con.BeginTransaction())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var parameters = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
|
Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(mapper.InsertCommandText))
|
if (!string.IsNullOrEmpty(mapper.InsertCommandText))
|
||||||
{
|
{
|
||||||
cmd.CommandText = mapper.InsertCommandText;
|
cmd.CommandText = mapper.InsertCommandText;
|
||||||
|
|
||||||
foreach (var col in mapper.ColumnsMap.Values
|
foreach (DynamicPropertyInvoker col in mapper.ColumnsMap.Values
|
||||||
.Where(di => !di.Ignore && di.InsertCommandParameter != null)
|
.Where(di => !di.Ignore && di.InsertCommandParameter != null)
|
||||||
.OrderBy(di => di.InsertCommandParameter.Ordinal))
|
.OrderBy(di => di.InsertCommandParameter.Ordinal))
|
||||||
{
|
{
|
||||||
var para = cmd.CreateParameter();
|
IDbDataParameter para = cmd.CreateParameter();
|
||||||
para.ParameterName = col.InsertCommandParameter.Name;
|
para.ParameterName = col.InsertCommandParameter.Name;
|
||||||
para.DbType = col.InsertCommandParameter.Type;
|
para.DbType = col.InsertCommandParameter.Type;
|
||||||
cmd.Parameters.Add(para);
|
cmd.Parameters.Add(para);
|
||||||
@@ -372,9 +376,9 @@ namespace DynamORM
|
|||||||
else
|
else
|
||||||
PrepareBatchInsert<T>(mapper, cmd, parameters);
|
PrepareBatchInsert<T>(mapper, cmd, parameters);
|
||||||
|
|
||||||
foreach (var o in e)
|
foreach (T o in e)
|
||||||
{
|
{
|
||||||
foreach (var m in parameters)
|
foreach (KeyValuePair<IDbDataParameter, DynamicPropertyInvoker> m in parameters)
|
||||||
m.Key.Value = m.Value.Get(o);
|
m.Key.Value = m.Value.Get(o);
|
||||||
|
|
||||||
affected += cmd.ExecuteNonQuery();
|
affected += cmd.ExecuteNonQuery();
|
||||||
@@ -389,7 +393,7 @@ namespace DynamORM
|
|||||||
|
|
||||||
affected = 0;
|
affected = 0;
|
||||||
|
|
||||||
var problematicCommand = new StringBuilder();
|
StringBuilder problematicCommand = new StringBuilder();
|
||||||
cmd.Dump(problematicCommand);
|
cmd.Dump(problematicCommand);
|
||||||
|
|
||||||
throw new InvalidOperationException(problematicCommand.ToString(), ex);
|
throw new InvalidOperationException(problematicCommand.ToString(), ex);
|
||||||
@@ -439,27 +443,27 @@ namespace DynamORM
|
|||||||
public virtual int Update<T>(IEnumerable<T> e) where T : class
|
public virtual int Update<T>(IEnumerable<T> e) where T : class
|
||||||
{
|
{
|
||||||
int affected = 0;
|
int affected = 0;
|
||||||
var mapper = DynamicMapperCache.GetMapper(typeof(T));
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(typeof(T));
|
||||||
|
|
||||||
if (mapper != null)
|
if (mapper != null)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var tra = con.BeginTransaction())
|
using (IDbTransaction tra = con.BeginTransaction())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var parameters = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
|
Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(mapper.UpdateCommandText))
|
if (!string.IsNullOrEmpty(mapper.UpdateCommandText))
|
||||||
{
|
{
|
||||||
cmd.CommandText = mapper.UpdateCommandText;
|
cmd.CommandText = mapper.UpdateCommandText;
|
||||||
|
|
||||||
foreach (var col in mapper.ColumnsMap.Values
|
foreach (DynamicPropertyInvoker col in mapper.ColumnsMap.Values
|
||||||
.Where(di => !di.Ignore && di.UpdateCommandParameter != null)
|
.Where(di => !di.Ignore && di.UpdateCommandParameter != null)
|
||||||
.OrderBy(di => di.UpdateCommandParameter.Ordinal))
|
.OrderBy(di => di.UpdateCommandParameter.Ordinal))
|
||||||
{
|
{
|
||||||
var para = cmd.CreateParameter();
|
IDbDataParameter para = cmd.CreateParameter();
|
||||||
para.ParameterName = col.UpdateCommandParameter.Name;
|
para.ParameterName = col.UpdateCommandParameter.Name;
|
||||||
para.DbType = col.UpdateCommandParameter.Type;
|
para.DbType = col.UpdateCommandParameter.Type;
|
||||||
cmd.Parameters.Add(para);
|
cmd.Parameters.Add(para);
|
||||||
@@ -470,9 +474,9 @@ namespace DynamORM
|
|||||||
else
|
else
|
||||||
PrepareBatchUpdate<T>(mapper, cmd, parameters);
|
PrepareBatchUpdate<T>(mapper, cmd, parameters);
|
||||||
|
|
||||||
foreach (var o in e)
|
foreach (T o in e)
|
||||||
{
|
{
|
||||||
foreach (var m in parameters)
|
foreach (KeyValuePair<IDbDataParameter, DynamicPropertyInvoker> m in parameters)
|
||||||
m.Key.Value = m.Value.Get(o);
|
m.Key.Value = m.Value.Get(o);
|
||||||
|
|
||||||
affected += cmd.ExecuteNonQuery();
|
affected += cmd.ExecuteNonQuery();
|
||||||
@@ -487,7 +491,7 @@ namespace DynamORM
|
|||||||
|
|
||||||
affected = 0;
|
affected = 0;
|
||||||
|
|
||||||
var problematicCommand = new StringBuilder();
|
StringBuilder problematicCommand = new StringBuilder();
|
||||||
cmd.Dump(problematicCommand);
|
cmd.Dump(problematicCommand);
|
||||||
|
|
||||||
throw new InvalidOperationException(problematicCommand.ToString(), ex);
|
throw new InvalidOperationException(problematicCommand.ToString(), ex);
|
||||||
@@ -505,30 +509,30 @@ namespace DynamORM
|
|||||||
public virtual int UpdateOrInsert<T>(IEnumerable<T> e) where T : class
|
public virtual int UpdateOrInsert<T>(IEnumerable<T> e) where T : class
|
||||||
{
|
{
|
||||||
int affected = 0;
|
int affected = 0;
|
||||||
var mapper = DynamicMapperCache.GetMapper(typeof(T));
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(typeof(T));
|
||||||
|
|
||||||
if (mapper != null)
|
if (mapper != null)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var tra = con.BeginTransaction())
|
using (IDbTransaction tra = con.BeginTransaction())
|
||||||
using (var cmdUp = con.CreateCommand())
|
using (IDbCommand cmdUp = con.CreateCommand())
|
||||||
using (var cmdIn = con.CreateCommand())
|
using (IDbCommand cmdIn = con.CreateCommand())
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
#region Update
|
#region Update
|
||||||
|
|
||||||
var parametersUp = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
|
Dictionary<IDbDataParameter, DynamicPropertyInvoker> parametersUp = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(mapper.UpdateCommandText))
|
if (!string.IsNullOrEmpty(mapper.UpdateCommandText))
|
||||||
{
|
{
|
||||||
cmdUp.CommandText = mapper.UpdateCommandText;
|
cmdUp.CommandText = mapper.UpdateCommandText;
|
||||||
|
|
||||||
foreach (var col in mapper.ColumnsMap.Values
|
foreach (DynamicPropertyInvoker col in mapper.ColumnsMap.Values
|
||||||
.Where(di => !di.Ignore && di.UpdateCommandParameter != null)
|
.Where(di => !di.Ignore && di.UpdateCommandParameter != null)
|
||||||
.OrderBy(di => di.UpdateCommandParameter.Ordinal))
|
.OrderBy(di => di.UpdateCommandParameter.Ordinal))
|
||||||
{
|
{
|
||||||
var para = cmdUp.CreateParameter();
|
IDbDataParameter para = cmdUp.CreateParameter();
|
||||||
para.ParameterName = col.UpdateCommandParameter.Name;
|
para.ParameterName = col.UpdateCommandParameter.Name;
|
||||||
para.DbType = col.UpdateCommandParameter.Type;
|
para.DbType = col.UpdateCommandParameter.Type;
|
||||||
cmdUp.Parameters.Add(para);
|
cmdUp.Parameters.Add(para);
|
||||||
@@ -543,17 +547,17 @@ namespace DynamORM
|
|||||||
|
|
||||||
#region Insert
|
#region Insert
|
||||||
|
|
||||||
var parametersIn = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
|
Dictionary<IDbDataParameter, DynamicPropertyInvoker> parametersIn = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(mapper.InsertCommandText))
|
if (!string.IsNullOrEmpty(mapper.InsertCommandText))
|
||||||
{
|
{
|
||||||
cmdIn.CommandText = mapper.InsertCommandText;
|
cmdIn.CommandText = mapper.InsertCommandText;
|
||||||
|
|
||||||
foreach (var col in mapper.ColumnsMap.Values
|
foreach (DynamicPropertyInvoker col in mapper.ColumnsMap.Values
|
||||||
.Where(di => !di.Ignore && di.InsertCommandParameter != null)
|
.Where(di => !di.Ignore && di.InsertCommandParameter != null)
|
||||||
.OrderBy(di => di.InsertCommandParameter.Ordinal))
|
.OrderBy(di => di.InsertCommandParameter.Ordinal))
|
||||||
{
|
{
|
||||||
var para = cmdIn.CreateParameter();
|
IDbDataParameter para = cmdIn.CreateParameter();
|
||||||
para.ParameterName = col.InsertCommandParameter.Name;
|
para.ParameterName = col.InsertCommandParameter.Name;
|
||||||
para.DbType = col.InsertCommandParameter.Type;
|
para.DbType = col.InsertCommandParameter.Type;
|
||||||
cmdIn.Parameters.Add(para);
|
cmdIn.Parameters.Add(para);
|
||||||
@@ -566,15 +570,15 @@ namespace DynamORM
|
|||||||
|
|
||||||
#endregion Insert
|
#endregion Insert
|
||||||
|
|
||||||
foreach (var o in e)
|
foreach (T o in e)
|
||||||
{
|
{
|
||||||
foreach (var m in parametersUp)
|
foreach (KeyValuePair<IDbDataParameter, DynamicPropertyInvoker> m in parametersUp)
|
||||||
m.Key.Value = m.Value.Get(o);
|
m.Key.Value = m.Value.Get(o);
|
||||||
|
|
||||||
int a = cmdUp.ExecuteNonQuery();
|
int a = cmdUp.ExecuteNonQuery();
|
||||||
if (a == 0)
|
if (a == 0)
|
||||||
{
|
{
|
||||||
foreach (var m in parametersIn)
|
foreach (KeyValuePair<IDbDataParameter, DynamicPropertyInvoker> m in parametersIn)
|
||||||
m.Key.Value = m.Value.Get(o);
|
m.Key.Value = m.Value.Get(o);
|
||||||
|
|
||||||
a = cmdIn.ExecuteNonQuery();
|
a = cmdIn.ExecuteNonQuery();
|
||||||
@@ -592,7 +596,7 @@ namespace DynamORM
|
|||||||
|
|
||||||
affected = 0;
|
affected = 0;
|
||||||
|
|
||||||
var problematicCommand = new StringBuilder();
|
StringBuilder problematicCommand = new StringBuilder();
|
||||||
cmdUp.Dump(problematicCommand);
|
cmdUp.Dump(problematicCommand);
|
||||||
|
|
||||||
throw new InvalidOperationException(problematicCommand.ToString(), ex);
|
throw new InvalidOperationException(problematicCommand.ToString(), ex);
|
||||||
@@ -634,27 +638,27 @@ namespace DynamORM
|
|||||||
public virtual int Delete<T>(IEnumerable<T> e) where T : class
|
public virtual int Delete<T>(IEnumerable<T> e) where T : class
|
||||||
{
|
{
|
||||||
int affected = 0;
|
int affected = 0;
|
||||||
var mapper = DynamicMapperCache.GetMapper(typeof(T));
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(typeof(T));
|
||||||
|
|
||||||
if (mapper != null)
|
if (mapper != null)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var tra = con.BeginTransaction())
|
using (IDbTransaction tra = con.BeginTransaction())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var parameters = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
|
Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(mapper.DeleteCommandText))
|
if (!string.IsNullOrEmpty(mapper.DeleteCommandText))
|
||||||
{
|
{
|
||||||
cmd.CommandText = mapper.DeleteCommandText;
|
cmd.CommandText = mapper.DeleteCommandText;
|
||||||
|
|
||||||
foreach (var col in mapper.ColumnsMap.Values
|
foreach (DynamicPropertyInvoker col in mapper.ColumnsMap.Values
|
||||||
.Where(di => !di.Ignore && di.DeleteCommandParameter != null)
|
.Where(di => !di.Ignore && di.DeleteCommandParameter != null)
|
||||||
.OrderBy(di => di.DeleteCommandParameter.Ordinal))
|
.OrderBy(di => di.DeleteCommandParameter.Ordinal))
|
||||||
{
|
{
|
||||||
var para = cmd.CreateParameter();
|
IDbDataParameter para = cmd.CreateParameter();
|
||||||
para.ParameterName = col.DeleteCommandParameter.Name;
|
para.ParameterName = col.DeleteCommandParameter.Name;
|
||||||
para.DbType = col.DeleteCommandParameter.Type;
|
para.DbType = col.DeleteCommandParameter.Type;
|
||||||
cmd.Parameters.Add(para);
|
cmd.Parameters.Add(para);
|
||||||
@@ -665,9 +669,9 @@ namespace DynamORM
|
|||||||
else
|
else
|
||||||
PrepareBatchDelete<T>(mapper, cmd, parameters);
|
PrepareBatchDelete<T>(mapper, cmd, parameters);
|
||||||
|
|
||||||
foreach (var o in e)
|
foreach (T o in e)
|
||||||
{
|
{
|
||||||
foreach (var m in parameters)
|
foreach (KeyValuePair<IDbDataParameter, DynamicPropertyInvoker> m in parameters)
|
||||||
m.Key.Value = m.Value.Get(o);
|
m.Key.Value = m.Value.Get(o);
|
||||||
|
|
||||||
affected += cmd.ExecuteNonQuery();
|
affected += cmd.ExecuteNonQuery();
|
||||||
@@ -682,7 +686,7 @@ namespace DynamORM
|
|||||||
|
|
||||||
affected = 0;
|
affected = 0;
|
||||||
|
|
||||||
var problematicCommand = new StringBuilder();
|
StringBuilder problematicCommand = new StringBuilder();
|
||||||
cmd.Dump(problematicCommand);
|
cmd.Dump(problematicCommand);
|
||||||
|
|
||||||
throw new InvalidOperationException(problematicCommand.ToString(), ex);
|
throw new InvalidOperationException(problematicCommand.ToString(), ex);
|
||||||
@@ -696,11 +700,11 @@ namespace DynamORM
|
|||||||
private void PrepareBatchInsert<T>(DynamicTypeMap mapper, IDbCommand cmd, Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters)
|
private void PrepareBatchInsert<T>(DynamicTypeMap mapper, IDbCommand cmd, Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters)
|
||||||
{
|
{
|
||||||
DynamicPropertyInvoker currentprop = null;
|
DynamicPropertyInvoker currentprop = null;
|
||||||
var temp = new Dictionary<string, DynamicPropertyInvoker>();
|
Dictionary<string, DynamicPropertyInvoker> temp = new Dictionary<string, DynamicPropertyInvoker>();
|
||||||
var schema = this.GetSchema<T>();
|
Dictionary<string, DynamicSchemaColumn> schema = this.GetSchema<T>();
|
||||||
int ord = 0;
|
int ord = 0;
|
||||||
|
|
||||||
var ib = Insert<T>()
|
IDynamicInsertQueryBuilder ib = Insert<T>()
|
||||||
.SetVirtualMode(true)
|
.SetVirtualMode(true)
|
||||||
.CreateTemporaryParameterAction(p => temp[p.Name] = currentprop)
|
.CreateTemporaryParameterAction(p => temp[p.Name] = currentprop)
|
||||||
.CreateParameterAction((p, cp) =>
|
.CreateParameterAction((p, cp) =>
|
||||||
@@ -714,10 +718,10 @@ namespace DynamORM
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
foreach (var prop in mapper.PropertyMap)
|
foreach (KeyValuePair<string, string> prop in mapper.PropertyMap)
|
||||||
if (!mapper.Ignored.Contains(prop.Key))
|
if (!mapper.Ignored.Contains(prop.Key))
|
||||||
{
|
{
|
||||||
var col = mapper.PropertyMap.TryGetValue(prop.Key) ?? prop.Key;
|
string col = mapper.PropertyMap.TryGetValue(prop.Key) ?? prop.Key;
|
||||||
currentprop = mapper.ColumnsMap.TryGetValue(col.ToLower());
|
currentprop = mapper.ColumnsMap.TryGetValue(col.ToLower());
|
||||||
|
|
||||||
if (currentprop.Ignore || (currentprop.Column != null && currentprop.Column.IsNoInsert))
|
if (currentprop.Ignore || (currentprop.Column != null && currentprop.Column.IsNoInsert))
|
||||||
@@ -743,11 +747,11 @@ namespace DynamORM
|
|||||||
private void PrepareBatchUpdate<T>(DynamicTypeMap mapper, IDbCommand cmd, Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters)
|
private void PrepareBatchUpdate<T>(DynamicTypeMap mapper, IDbCommand cmd, Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters)
|
||||||
{
|
{
|
||||||
DynamicPropertyInvoker currentprop = null;
|
DynamicPropertyInvoker currentprop = null;
|
||||||
var temp = new Dictionary<string, DynamicPropertyInvoker>();
|
Dictionary<string, DynamicPropertyInvoker> temp = new Dictionary<string, DynamicPropertyInvoker>();
|
||||||
var schema = this.GetSchema<T>();
|
Dictionary<string, DynamicSchemaColumn> schema = this.GetSchema<T>();
|
||||||
int ord = 0;
|
int ord = 0;
|
||||||
|
|
||||||
var ib = Update<T>()
|
IDynamicUpdateQueryBuilder ib = Update<T>()
|
||||||
.SetVirtualMode(true)
|
.SetVirtualMode(true)
|
||||||
.CreateTemporaryParameterAction(p => temp[p.Name] = currentprop)
|
.CreateTemporaryParameterAction(p => temp[p.Name] = currentprop)
|
||||||
.CreateParameterAction((p, cp) =>
|
.CreateParameterAction((p, cp) =>
|
||||||
@@ -761,10 +765,10 @@ namespace DynamORM
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
foreach (var prop in mapper.PropertyMap)
|
foreach (KeyValuePair<string, string> prop in mapper.PropertyMap)
|
||||||
if (!mapper.Ignored.Contains(prop.Key))
|
if (!mapper.Ignored.Contains(prop.Key))
|
||||||
{
|
{
|
||||||
var col = mapper.PropertyMap.TryGetValue(prop.Key) ?? prop.Key;
|
string col = mapper.PropertyMap.TryGetValue(prop.Key) ?? prop.Key;
|
||||||
currentprop = mapper.ColumnsMap.TryGetValue(col.ToLower());
|
currentprop = mapper.ColumnsMap.TryGetValue(col.ToLower());
|
||||||
|
|
||||||
if (currentprop.Ignore)
|
if (currentprop.Ignore)
|
||||||
@@ -772,7 +776,7 @@ namespace DynamORM
|
|||||||
|
|
||||||
if (currentprop.Get != null)
|
if (currentprop.Get != null)
|
||||||
{
|
{
|
||||||
var colS = schema == null ? null : schema.TryGetNullable(col.ToLower());
|
DynamicSchemaColumn? colS = schema == null ? null : schema.TryGetNullable(col.ToLower());
|
||||||
|
|
||||||
if (colS.HasValue)
|
if (colS.HasValue)
|
||||||
{
|
{
|
||||||
@@ -816,11 +820,11 @@ namespace DynamORM
|
|||||||
private void PrepareBatchDelete<T>(DynamicTypeMap mapper, IDbCommand cmd, Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters)
|
private void PrepareBatchDelete<T>(DynamicTypeMap mapper, IDbCommand cmd, Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters)
|
||||||
{
|
{
|
||||||
DynamicPropertyInvoker currentprop = null;
|
DynamicPropertyInvoker currentprop = null;
|
||||||
var temp = new Dictionary<string, DynamicPropertyInvoker>();
|
Dictionary<string, DynamicPropertyInvoker> temp = new Dictionary<string, DynamicPropertyInvoker>();
|
||||||
var schema = this.GetSchema<T>();
|
Dictionary<string, DynamicSchemaColumn> schema = this.GetSchema<T>();
|
||||||
int ord = 0;
|
int ord = 0;
|
||||||
|
|
||||||
var ib = Delete<T>()
|
IDynamicDeleteQueryBuilder ib = Delete<T>()
|
||||||
.SetVirtualMode(true)
|
.SetVirtualMode(true)
|
||||||
.CreateTemporaryParameterAction(p => temp[p.Name] = currentprop)
|
.CreateTemporaryParameterAction(p => temp[p.Name] = currentprop)
|
||||||
.CreateParameterAction((p, cp) =>
|
.CreateParameterAction((p, cp) =>
|
||||||
@@ -834,10 +838,10 @@ namespace DynamORM
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
foreach (var prop in mapper.PropertyMap)
|
foreach (KeyValuePair<string, string> prop in mapper.PropertyMap)
|
||||||
if (!mapper.Ignored.Contains(prop.Key))
|
if (!mapper.Ignored.Contains(prop.Key))
|
||||||
{
|
{
|
||||||
var col = mapper.PropertyMap.TryGetValue(prop.Key) ?? prop.Key;
|
string col = mapper.PropertyMap.TryGetValue(prop.Key) ?? prop.Key;
|
||||||
currentprop = mapper.ColumnsMap.TryGetValue(col.ToLower());
|
currentprop = mapper.ColumnsMap.TryGetValue(col.ToLower());
|
||||||
|
|
||||||
if (currentprop.Ignore)
|
if (currentprop.Ignore)
|
||||||
@@ -845,7 +849,7 @@ namespace DynamORM
|
|||||||
|
|
||||||
if (currentprop.Get != null)
|
if (currentprop.Get != null)
|
||||||
{
|
{
|
||||||
var colS = schema == null ? null : schema.TryGetNullable(col.ToLower());
|
DynamicSchemaColumn? colS = schema == null ? null : schema.TryGetNullable(col.ToLower());
|
||||||
|
|
||||||
if (colS != null)
|
if (colS != null)
|
||||||
{
|
{
|
||||||
@@ -898,8 +902,8 @@ namespace DynamORM
|
|||||||
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
|
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
|
||||||
throw new InvalidOperationException("Database connection desn't support stored procedures.");
|
throw new InvalidOperationException("Database connection desn't support stored procedures.");
|
||||||
|
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
{
|
{
|
||||||
return cmd
|
return cmd
|
||||||
.SetCommand(CommandType.StoredProcedure, procName)
|
.SetCommand(CommandType.StoredProcedure, procName)
|
||||||
@@ -917,8 +921,8 @@ namespace DynamORM
|
|||||||
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
|
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
|
||||||
throw new InvalidOperationException("Database connection desn't support stored procedures.");
|
throw new InvalidOperationException("Database connection desn't support stored procedures.");
|
||||||
|
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
{
|
{
|
||||||
return cmd
|
return cmd
|
||||||
.SetCommand(CommandType.StoredProcedure, procName)
|
.SetCommand(CommandType.StoredProcedure, procName)
|
||||||
@@ -936,8 +940,8 @@ namespace DynamORM
|
|||||||
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
|
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
|
||||||
throw new InvalidOperationException("Database connection desn't support stored procedures.");
|
throw new InvalidOperationException("Database connection desn't support stored procedures.");
|
||||||
|
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
{
|
{
|
||||||
return cmd
|
return cmd
|
||||||
.SetCommand(CommandType.StoredProcedure, procName)
|
.SetCommand(CommandType.StoredProcedure, procName)
|
||||||
@@ -958,8 +962,8 @@ namespace DynamORM
|
|||||||
/// <returns>Number of affected rows.</returns>
|
/// <returns>Number of affected rows.</returns>
|
||||||
public virtual int Execute(string sql, params object[] args)
|
public virtual int Execute(string sql, params object[] args)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
{
|
{
|
||||||
return cmd
|
return cmd
|
||||||
.SetCommand(sql).AddParameters(this, args)
|
.SetCommand(sql).AddParameters(this, args)
|
||||||
@@ -972,8 +976,8 @@ namespace DynamORM
|
|||||||
/// <returns>Number of affected rows.</returns>
|
/// <returns>Number of affected rows.</returns>
|
||||||
public virtual int Execute(IDynamicQueryBuilder builder)
|
public virtual int Execute(IDynamicQueryBuilder builder)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
{
|
{
|
||||||
return cmd
|
return cmd
|
||||||
.SetCommand(builder)
|
.SetCommand(builder)
|
||||||
@@ -988,19 +992,15 @@ namespace DynamORM
|
|||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
{
|
{
|
||||||
using (var trans = con.BeginTransaction())
|
using (IDbTransaction trans = con.BeginTransaction())
|
||||||
{
|
{
|
||||||
foreach (var builder in builders)
|
foreach (IDynamicQueryBuilder builder in builders)
|
||||||
{
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
using (var cmd = con.CreateCommand())
|
|
||||||
{
|
|
||||||
ret += cmd
|
ret += cmd
|
||||||
.SetCommand(builder)
|
.SetCommand(builder)
|
||||||
.ExecuteNonQuery();
|
.ExecuteNonQuery();
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
trans.Commit();
|
trans.Commit();
|
||||||
}
|
}
|
||||||
@@ -1021,8 +1021,8 @@ namespace DynamORM
|
|||||||
/// <returns>Result of a query.</returns>
|
/// <returns>Result of a query.</returns>
|
||||||
public virtual object Scalar(string sql, params object[] args)
|
public virtual object Scalar(string sql, params object[] args)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
{
|
{
|
||||||
return cmd
|
return cmd
|
||||||
.SetCommand(sql).AddParameters(this, args)
|
.SetCommand(sql).AddParameters(this, args)
|
||||||
@@ -1035,8 +1035,8 @@ namespace DynamORM
|
|||||||
/// <returns>Result of a query.</returns>
|
/// <returns>Result of a query.</returns>
|
||||||
public virtual object Scalar(IDynamicQueryBuilder builder)
|
public virtual object Scalar(IDynamicQueryBuilder builder)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
{
|
{
|
||||||
return cmd
|
return cmd
|
||||||
.SetCommand(builder)
|
.SetCommand(builder)
|
||||||
@@ -1055,8 +1055,8 @@ namespace DynamORM
|
|||||||
/// <returns>Result of a query.</returns>
|
/// <returns>Result of a query.</returns>
|
||||||
public virtual T ScalarAs<T>(string sql, params object[] args)
|
public virtual T ScalarAs<T>(string sql, params object[] args)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
{
|
{
|
||||||
return cmd
|
return cmd
|
||||||
.SetCommand(sql).AddParameters(this, args)
|
.SetCommand(sql).AddParameters(this, args)
|
||||||
@@ -1071,8 +1071,8 @@ namespace DynamORM
|
|||||||
/// <returns>Result of a query.</returns>
|
/// <returns>Result of a query.</returns>
|
||||||
public virtual T ScalarAs<T>(IDynamicQueryBuilder builder, T defaultValue = default(T))
|
public virtual T ScalarAs<T>(IDynamicQueryBuilder builder, T defaultValue = default(T))
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
{
|
{
|
||||||
return cmd
|
return cmd
|
||||||
.SetCommand(builder)
|
.SetCommand(builder)
|
||||||
@@ -1094,9 +1094,9 @@ namespace DynamORM
|
|||||||
/// <returns>Enumerator of objects expanded from query.</returns>
|
/// <returns>Enumerator of objects expanded from query.</returns>
|
||||||
public virtual IEnumerable<dynamic> Query(string sql, params object[] args)
|
public virtual IEnumerable<dynamic> Query(string sql, params object[] args)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
using (var rdr = cmd
|
using (IDataReader rdr = cmd
|
||||||
.SetCommand(sql)
|
.SetCommand(sql)
|
||||||
.AddParameters(this, args)
|
.AddParameters(this, args)
|
||||||
.ExecuteReader())
|
.ExecuteReader())
|
||||||
@@ -1112,7 +1112,7 @@ namespace DynamORM
|
|||||||
}
|
}
|
||||||
catch (ArgumentException argex)
|
catch (ArgumentException argex)
|
||||||
{
|
{
|
||||||
var sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
cmd.Dump(sb);
|
cmd.Dump(sb);
|
||||||
|
|
||||||
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
|
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
|
||||||
@@ -1128,9 +1128,9 @@ namespace DynamORM
|
|||||||
/// <returns>Enumerator of objects expanded from query.</returns>
|
/// <returns>Enumerator of objects expanded from query.</returns>
|
||||||
public virtual IEnumerable<dynamic> Query(IDynamicQueryBuilder builder)
|
public virtual IEnumerable<dynamic> Query(IDynamicQueryBuilder builder)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand())
|
using (IDbCommand cmd = con.CreateCommand())
|
||||||
using (var rdr = cmd
|
using (IDataReader rdr = cmd
|
||||||
.SetCommand(builder)
|
.SetCommand(builder)
|
||||||
.ExecuteReader())
|
.ExecuteReader())
|
||||||
while (rdr.Read())
|
while (rdr.Read())
|
||||||
@@ -1145,7 +1145,7 @@ namespace DynamORM
|
|||||||
}
|
}
|
||||||
catch (ArgumentException argex)
|
catch (ArgumentException argex)
|
||||||
{
|
{
|
||||||
var sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
cmd.Dump(sb);
|
cmd.Dump(sb);
|
||||||
|
|
||||||
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
|
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
|
||||||
@@ -1165,8 +1165,8 @@ namespace DynamORM
|
|||||||
/// <returns>Query schema.</returns>
|
/// <returns>Query schema.</returns>
|
||||||
public Dictionary<string, DynamicSchemaColumn> GetQuerySchema(IDynamicSelectQueryBuilder builder)
|
public Dictionary<string, DynamicSchemaColumn> GetQuerySchema(IDynamicSelectQueryBuilder builder)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand().SetCommand(builder))
|
using (IDbCommand cmd = con.CreateCommand().SetCommand(builder))
|
||||||
return ReadSchema(cmd)
|
return ReadSchema(cmd)
|
||||||
.Distinct()
|
.Distinct()
|
||||||
.ToDictionary(k => k.Name.ToLower(), k => k);
|
.ToDictionary(k => k.Name.ToLower(), k => k);
|
||||||
@@ -1178,8 +1178,8 @@ namespace DynamORM
|
|||||||
/// <returns>Query schema.</returns>
|
/// <returns>Query schema.</returns>
|
||||||
public Dictionary<string, DynamicSchemaColumn> GetQuerySchema(string sql, params object[] args)
|
public Dictionary<string, DynamicSchemaColumn> GetQuerySchema(string sql, params object[] args)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand().SetCommand(sql, args))
|
using (IDbCommand cmd = con.CreateCommand().SetCommand(sql, args))
|
||||||
return ReadSchema(cmd)
|
return ReadSchema(cmd)
|
||||||
.Distinct()
|
.Distinct()
|
||||||
.ToDictionary(k => k.Name.ToLower(), k => k);
|
.ToDictionary(k => k.Name.ToLower(), k => k);
|
||||||
@@ -1273,7 +1273,7 @@ namespace DynamORM
|
|||||||
{
|
{
|
||||||
lock (SyncLock)
|
lock (SyncLock)
|
||||||
{
|
{
|
||||||
foreach (var s in Schema)
|
foreach (KeyValuePair<string, Dictionary<string, DynamicSchemaColumn>> s in Schema)
|
||||||
if (s.Value != null)
|
if (s.Value != null)
|
||||||
s.Value.Clear();
|
s.Value.Clear();
|
||||||
|
|
||||||
@@ -1288,8 +1288,8 @@ namespace DynamORM
|
|||||||
/// If your database doesn't get those values in upper case (like most of the databases) you should override this method.</returns>
|
/// If your database doesn't get those values in upper case (like most of the databases) you should override this method.</returns>
|
||||||
protected virtual IList<DynamicSchemaColumn> ReadSchema(string table, string owner)
|
protected virtual IList<DynamicSchemaColumn> ReadSchema(string table, string owner)
|
||||||
{
|
{
|
||||||
using (var con = Open())
|
using (IDbConnection con = Open())
|
||||||
using (var cmd = con.CreateCommand()
|
using (IDbCommand cmd = con.CreateCommand()
|
||||||
.SetCommand(string.Format("SELECT * FROM {0}{1} WHERE 1 = 0",
|
.SetCommand(string.Format("SELECT * FROM {0}{1} WHERE 1 = 0",
|
||||||
!string.IsNullOrEmpty(owner) ? string.Format("{0}.", DecorateName(owner)) : string.Empty,
|
!string.IsNullOrEmpty(owner) ? string.Format("{0}.", DecorateName(owner)) : string.Empty,
|
||||||
DecorateName(table))))
|
DecorateName(table))))
|
||||||
@@ -1303,11 +1303,11 @@ namespace DynamORM
|
|||||||
/// If your database doesn't get those values in upper case (like most of the databases) you should override this method.</returns>
|
/// If your database doesn't get those values in upper case (like most of the databases) you should override this method.</returns>
|
||||||
protected virtual IEnumerable<DynamicSchemaColumn> ReadSchema(IDbCommand cmd)
|
protected virtual IEnumerable<DynamicSchemaColumn> ReadSchema(IDbCommand cmd)
|
||||||
{
|
{
|
||||||
using (var rdr = cmd.ExecuteReader(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo))
|
using (IDataReader rdr = cmd.ExecuteReader(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo))
|
||||||
using (var st = rdr.GetSchemaTable())
|
using (DataTable st = rdr.GetSchemaTable())
|
||||||
foreach (DataRow col in st.Rows)
|
foreach (DataRow col in st.Rows)
|
||||||
{
|
{
|
||||||
var c = col.RowToDynamicUpper();
|
dynamic c = col.RowToDynamicUpper();
|
||||||
|
|
||||||
yield return new DynamicSchemaColumn
|
yield return new DynamicSchemaColumn
|
||||||
{
|
{
|
||||||
@@ -1508,7 +1508,10 @@ namespace DynamORM
|
|||||||
/// <param name="cmd">The command to dump.</param>
|
/// <param name="cmd">The command to dump.</param>
|
||||||
public virtual void DumpCommand(IDbCommand cmd)
|
public virtual void DumpCommand(IDbCommand cmd)
|
||||||
{
|
{
|
||||||
cmd.Dump(Console.Out);
|
if (DumpCommandDelegate != null)
|
||||||
|
DumpCommandDelegate(cmd, cmd.DumpToString());
|
||||||
|
else
|
||||||
|
cmd.Dump(Console.Out);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion Decorators
|
#endregion Decorators
|
||||||
@@ -1572,7 +1575,7 @@ namespace DynamORM
|
|||||||
// Close all commands
|
// Close all commands
|
||||||
if (CommandsPool.ContainsKey(connection))
|
if (CommandsPool.ContainsKey(connection))
|
||||||
{
|
{
|
||||||
var tmp = CommandsPool[connection].ToList();
|
List<IDbCommand> tmp = CommandsPool[connection].ToList();
|
||||||
tmp.ForEach(cmd => cmd.Dispose());
|
tmp.ForEach(cmd => cmd.Dispose());
|
||||||
|
|
||||||
CommandsPool[connection].Clear();
|
CommandsPool[connection].Clear();
|
||||||
@@ -1633,7 +1636,7 @@ namespace DynamORM
|
|||||||
|
|
||||||
return _tempConn.BeginTransaction(null, null, () =>
|
return _tempConn.BeginTransaction(null, null, () =>
|
||||||
{
|
{
|
||||||
var t = TransactionPool.TryGetValue(_tempConn.Connection);
|
Stack<IDbTransaction> t = TransactionPool.TryGetValue(_tempConn.Connection);
|
||||||
|
|
||||||
if (t == null | t.Count == 0)
|
if (t == null | t.Count == 0)
|
||||||
{
|
{
|
||||||
@@ -1653,7 +1656,7 @@ namespace DynamORM
|
|||||||
|
|
||||||
return _tempConn.BeginTransaction(il, null, () =>
|
return _tempConn.BeginTransaction(il, null, () =>
|
||||||
{
|
{
|
||||||
var t = TransactionPool.TryGetValue(_tempConn.Connection);
|
Stack<IDbTransaction> t = TransactionPool.TryGetValue(_tempConn.Connection);
|
||||||
|
|
||||||
if (t == null | t.Count == 0)
|
if (t == null | t.Count == 0)
|
||||||
{
|
{
|
||||||
@@ -1673,7 +1676,7 @@ namespace DynamORM
|
|||||||
|
|
||||||
return _tempConn.BeginTransaction(null, custom, () =>
|
return _tempConn.BeginTransaction(null, custom, () =>
|
||||||
{
|
{
|
||||||
var t = TransactionPool.TryGetValue(_tempConn.Connection);
|
Stack<IDbTransaction> t = TransactionPool.TryGetValue(_tempConn.Connection);
|
||||||
|
|
||||||
if (t == null | t.Count == 0)
|
if (t == null | t.Count == 0)
|
||||||
{
|
{
|
||||||
@@ -1692,7 +1695,7 @@ namespace DynamORM
|
|||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
#if !DYNAMORM_OMMIT_OLDSYNTAX
|
#if !DYNAMORM_OMMIT_OLDSYNTAX
|
||||||
var tables = TablesCache.Values.ToList();
|
List<DynamicTable> tables = TablesCache.Values.ToList();
|
||||||
TablesCache.Clear();
|
TablesCache.Clear();
|
||||||
|
|
||||||
tables.ForEach(t => t.Dispose());
|
tables.ForEach(t => t.Dispose());
|
||||||
@@ -1700,12 +1703,12 @@ namespace DynamORM
|
|||||||
tables = null;
|
tables = null;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
foreach (var con in TransactionPool)
|
foreach (KeyValuePair<IDbConnection, Stack<IDbTransaction>> con in TransactionPool)
|
||||||
{
|
{
|
||||||
// Close all commands
|
// Close all commands
|
||||||
if (CommandsPool.ContainsKey(con.Key))
|
if (CommandsPool.ContainsKey(con.Key))
|
||||||
{
|
{
|
||||||
var tmp = CommandsPool[con.Key].ToList();
|
List<IDbCommand> tmp = CommandsPool[con.Key].ToList();
|
||||||
tmp.ForEach(cmd => cmd.Dispose());
|
tmp.ForEach(cmd => cmd.Dispose());
|
||||||
|
|
||||||
CommandsPool[con.Key].Clear();
|
CommandsPool[con.Key].Clear();
|
||||||
|
|||||||
@@ -209,7 +209,7 @@ namespace DynamORM
|
|||||||
public static IDbCommand AddParameters(this IDbCommand cmd, DynamicDatabase database, params object[] args)
|
public static IDbCommand AddParameters(this IDbCommand cmd, DynamicDatabase database, params object[] args)
|
||||||
{
|
{
|
||||||
if (args != null && args.Count() > 0)
|
if (args != null && args.Count() > 0)
|
||||||
foreach (var item in args)
|
foreach (object item in args)
|
||||||
cmd.AddParameter(database, item);
|
cmd.AddParameter(database, item);
|
||||||
|
|
||||||
return cmd;
|
return cmd;
|
||||||
@@ -223,7 +223,7 @@ namespace DynamORM
|
|||||||
public static IDbCommand AddParameters(this IDbCommand cmd, DynamicDatabase database, ExpandoObject args)
|
public static IDbCommand AddParameters(this IDbCommand cmd, DynamicDatabase database, ExpandoObject args)
|
||||||
{
|
{
|
||||||
if (args != null && args.Count() > 0)
|
if (args != null && args.Count() > 0)
|
||||||
foreach (var item in args.ToDictionary())
|
foreach (KeyValuePair<string, object> item in args.ToDictionary())
|
||||||
cmd.AddParameter(database, item.Key, item.Value);
|
cmd.AddParameter(database, item.Key, item.Value);
|
||||||
|
|
||||||
return cmd;
|
return cmd;
|
||||||
@@ -237,7 +237,7 @@ namespace DynamORM
|
|||||||
public static IDbCommand AddParameters(this IDbCommand cmd, DynamicDatabase database, DynamicExpando args)
|
public static IDbCommand AddParameters(this IDbCommand cmd, DynamicDatabase database, DynamicExpando args)
|
||||||
{
|
{
|
||||||
if (args != null && args.Count() > 0)
|
if (args != null && args.Count() > 0)
|
||||||
foreach (var item in args.ToDictionary())
|
foreach (KeyValuePair<string, object> item in args.ToDictionary())
|
||||||
cmd.AddParameter(database, item.Key, item.Value);
|
cmd.AddParameter(database, item.Key, item.Value);
|
||||||
|
|
||||||
return cmd;
|
return cmd;
|
||||||
@@ -261,7 +261,7 @@ namespace DynamORM
|
|||||||
/// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns>
|
/// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns>
|
||||||
public static IDbCommand AddParameter(this IDbCommand cmd, DynamicDatabase database, string name, object item)
|
public static IDbCommand AddParameter(this IDbCommand cmd, DynamicDatabase database, string name, object item)
|
||||||
{
|
{
|
||||||
var p = cmd.CreateParameter();
|
IDbDataParameter p = cmd.CreateParameter();
|
||||||
p.ParameterName = name;
|
p.ParameterName = name;
|
||||||
|
|
||||||
if (item == null || item == DBNull.Value)
|
if (item == null || item == DBNull.Value)
|
||||||
@@ -294,7 +294,7 @@ namespace DynamORM
|
|||||||
/// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns>
|
/// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns>
|
||||||
public static IDbCommand AddParameter(this IDbCommand cmd, IDynamicQueryBuilder builder, DynamicSchemaColumn? col, object value)
|
public static IDbCommand AddParameter(this IDbCommand cmd, IDynamicQueryBuilder builder, DynamicSchemaColumn? col, object value)
|
||||||
{
|
{
|
||||||
var p = cmd.CreateParameter();
|
IDbDataParameter p = cmd.CreateParameter();
|
||||||
p.ParameterName = builder.Database.GetParameterName(cmd.Parameters.Count);
|
p.ParameterName = builder.Database.GetParameterName(cmd.Parameters.Count);
|
||||||
|
|
||||||
if (col.HasValue)
|
if (col.HasValue)
|
||||||
@@ -339,10 +339,10 @@ namespace DynamORM
|
|||||||
/// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns>
|
/// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns>
|
||||||
public static IDbCommand AddParameter(this IDbCommand cmd, IDynamicQueryBuilder builder, DynamicColumn item)
|
public static IDbCommand AddParameter(this IDbCommand cmd, IDynamicQueryBuilder builder, DynamicColumn item)
|
||||||
{
|
{
|
||||||
var p = cmd.CreateParameter();
|
IDbDataParameter p = cmd.CreateParameter();
|
||||||
p.ParameterName = builder.Database.GetParameterName(cmd.Parameters.Count);
|
p.ParameterName = builder.Database.GetParameterName(cmd.Parameters.Count);
|
||||||
|
|
||||||
var col = item.Schema ?? (builder as DynamicQueryBuilder)
|
DynamicSchemaColumn? col = item.Schema ?? (builder as DynamicQueryBuilder)
|
||||||
.NullOr(b => b.GetColumnFromSchema(item.ColumnName),
|
.NullOr(b => b.GetColumnFromSchema(item.ColumnName),
|
||||||
builder.Tables.FirstOrDefault()
|
builder.Tables.FirstOrDefault()
|
||||||
.NullOr(t => t.Schema
|
.NullOr(t => t.Schema
|
||||||
@@ -679,7 +679,7 @@ namespace DynamORM
|
|||||||
ret = (T)o;
|
ret = (T)o;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var method = typeof(T).GetMethod(
|
MethodInfo method = typeof(T).GetMethod(
|
||||||
"TryParse",
|
"TryParse",
|
||||||
new Type[]
|
new Type[]
|
||||||
{
|
{
|
||||||
@@ -711,7 +711,7 @@ namespace DynamORM
|
|||||||
{
|
{
|
||||||
using (IDataReader reader = command.ExecuteReader())
|
using (IDataReader reader = command.ExecuteReader())
|
||||||
{
|
{
|
||||||
var method = typeof(T).GetMethod(
|
MethodInfo method = typeof(T).GetMethod(
|
||||||
"TryParse",
|
"TryParse",
|
||||||
new[]
|
new[]
|
||||||
{
|
{
|
||||||
@@ -733,16 +733,25 @@ namespace DynamORM
|
|||||||
{
|
{
|
||||||
if (handler != null)
|
if (handler != null)
|
||||||
ret = o.ToString().TryParseDefault<T>(defaultValue, handler);
|
ret = o.ToString().TryParseDefault<T>(defaultValue, handler);
|
||||||
|
else if (o is IConvertible && typeof(T).GetInterfaces().Any(i => i == typeof(IConvertible)))
|
||||||
|
ret = (T)Convert.ChangeType(o, typeof(T));
|
||||||
|
else if (typeof(T) == typeof(Guid))
|
||||||
|
{
|
||||||
|
if (o.GetType() == typeof(byte[]))
|
||||||
|
ret = (T)(object)new Guid((byte[])o);
|
||||||
|
else
|
||||||
|
ret = (T)(object)Guid.Parse(o.ToString());
|
||||||
|
}
|
||||||
|
else if (typeof(T) == typeof(string))
|
||||||
|
ret = (T)(o.ToString() as object);
|
||||||
|
else if (typeof(T) == typeof(object))
|
||||||
|
ret = (T)o;
|
||||||
else if (method != null)
|
else if (method != null)
|
||||||
ret = o.ToString().TryParseDefault<T>(defaultValue, delegate(string v, out T r)
|
ret = o.ToString().TryParseDefault<T>(defaultValue, delegate(string v, out T r)
|
||||||
{
|
{
|
||||||
r = defaultValue;
|
r = defaultValue;
|
||||||
return (bool)method.Invoke(null, new object[] { v, r });
|
return (bool)method.Invoke(null, new object[] { v, r });
|
||||||
});
|
});
|
||||||
else if (typeof(T) == typeof(string))
|
|
||||||
ret = (T)(o.ToString() as object);
|
|
||||||
else if (typeof(T) == typeof(object))
|
|
||||||
ret = (T)o;
|
|
||||||
else
|
else
|
||||||
throw new InvalidOperationException("Provided type can't be parsed using generic approach.");
|
throw new InvalidOperationException("Provided type can't be parsed using generic approach.");
|
||||||
}
|
}
|
||||||
@@ -762,7 +771,7 @@ namespace DynamORM
|
|||||||
/// <returns>Returns dumped <see cref="System.Data.IDbCommand"/> instance in string form.</returns>
|
/// <returns>Returns dumped <see cref="System.Data.IDbCommand"/> instance in string form.</returns>
|
||||||
public static string DumpToString(this IDbCommand command)
|
public static string DumpToString(this IDbCommand command)
|
||||||
{
|
{
|
||||||
var sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
command.Dump(sb);
|
command.Dump(sb);
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
@@ -932,7 +941,7 @@ namespace DynamORM
|
|||||||
/// <returns>This instance to permit chaining.</returns>
|
/// <returns>This instance to permit chaining.</returns>
|
||||||
public static T SubQuery<T>(this T b, Action<T, IDynamicSelectQueryBuilder> subquery) where T : IDynamicQueryBuilder
|
public static T SubQuery<T>(this T b, Action<T, IDynamicSelectQueryBuilder> subquery) where T : IDynamicQueryBuilder
|
||||||
{
|
{
|
||||||
var sub = b.SubQuery();
|
IDynamicSelectQueryBuilder sub = b.SubQuery();
|
||||||
|
|
||||||
subquery(b, sub);
|
subquery(b, sub);
|
||||||
|
|
||||||
@@ -950,7 +959,7 @@ namespace DynamORM
|
|||||||
/// <returns>This instance to permit chaining.</returns>
|
/// <returns>This instance to permit chaining.</returns>
|
||||||
public static T SubQuery<T>(this T b, Action<T, IDynamicSelectQueryBuilder> subquery, Func<dynamic, object> fn, params Func<dynamic, object>[] func) where T : IDynamicQueryBuilder
|
public static T SubQuery<T>(this T b, Action<T, IDynamicSelectQueryBuilder> subquery, Func<dynamic, object> fn, params Func<dynamic, object>[] func) where T : IDynamicQueryBuilder
|
||||||
{
|
{
|
||||||
var sub = b.SubQuery(fn, func);
|
IDynamicSelectQueryBuilder sub = b.SubQuery(fn, func);
|
||||||
|
|
||||||
subquery(b, sub);
|
subquery(b, sub);
|
||||||
|
|
||||||
@@ -968,7 +977,7 @@ namespace DynamORM
|
|||||||
/// <returns>List of things.</returns>
|
/// <returns>List of things.</returns>
|
||||||
public static List<dynamic> ToList(this IDataReader r)
|
public static List<dynamic> ToList(this IDataReader r)
|
||||||
{
|
{
|
||||||
var result = new List<dynamic>();
|
List<dynamic> result = new List<dynamic>();
|
||||||
|
|
||||||
while (r.Read())
|
while (r.Read())
|
||||||
result.Add(r.RowToDynamic());
|
result.Add(r.RowToDynamic());
|
||||||
@@ -981,10 +990,10 @@ namespace DynamORM
|
|||||||
/// <returns>Converted dictionary.</returns>
|
/// <returns>Converted dictionary.</returns>
|
||||||
public static dynamic ToDynamic(this IDictionary<string, object> d)
|
public static dynamic ToDynamic(this IDictionary<string, object> d)
|
||||||
{
|
{
|
||||||
var result = new DynamicExpando();
|
DynamicExpando result = new DynamicExpando();
|
||||||
var dict = (IDictionary<string, object>)result;
|
IDictionary<string, object> dict = (IDictionary<string, object>)result;
|
||||||
|
|
||||||
foreach (var prop in d)
|
foreach (KeyValuePair<string, object> prop in d)
|
||||||
dict.Add(prop.Key, prop.Value);
|
dict.Add(prop.Key, prop.Value);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@@ -995,10 +1004,10 @@ namespace DynamORM
|
|||||||
/// <returns>Converted dictionary.</returns>
|
/// <returns>Converted dictionary.</returns>
|
||||||
public static dynamic ToExpando(this IDictionary<string, object> d)
|
public static dynamic ToExpando(this IDictionary<string, object> d)
|
||||||
{
|
{
|
||||||
var result = new ExpandoObject();
|
ExpandoObject result = new ExpandoObject();
|
||||||
var dict = (IDictionary<string, object>)result;
|
IDictionary<string, object> dict = (IDictionary<string, object>)result;
|
||||||
|
|
||||||
foreach (var prop in d)
|
foreach (KeyValuePair<string, object> prop in d)
|
||||||
dict.Add(prop.Key, prop.Value);
|
dict.Add(prop.Key, prop.Value);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@@ -1009,13 +1018,13 @@ namespace DynamORM
|
|||||||
/// <returns>Converted object.</returns>
|
/// <returns>Converted object.</returns>
|
||||||
public static dynamic ToDynamic(this object o)
|
public static dynamic ToDynamic(this object o)
|
||||||
{
|
{
|
||||||
var ot = o.GetType();
|
Type ot = o.GetType();
|
||||||
|
|
||||||
if (ot == typeof(DynamicExpando) || ot == typeof(ExpandoObject))
|
if (ot == typeof(DynamicExpando) || ot == typeof(ExpandoObject))
|
||||||
return o;
|
return o;
|
||||||
|
|
||||||
var result = new DynamicExpando();
|
DynamicExpando result = new DynamicExpando();
|
||||||
var dict = (IDictionary<string, object>)result;
|
IDictionary<string, object> dict = (IDictionary<string, object>)result;
|
||||||
|
|
||||||
if (o is IDictionary<string, object>)
|
if (o is IDictionary<string, object>)
|
||||||
((IDictionary<string, object>)o)
|
((IDictionary<string, object>)o)
|
||||||
@@ -1023,7 +1032,7 @@ namespace DynamORM
|
|||||||
.ForEach(kvp => dict.Add(kvp.Key, kvp.Value));
|
.ForEach(kvp => dict.Add(kvp.Key, kvp.Value));
|
||||||
else if (ot == typeof(NameValueCollection) || ot.IsSubclassOf(typeof(NameValueCollection)))
|
else if (ot == typeof(NameValueCollection) || ot.IsSubclassOf(typeof(NameValueCollection)))
|
||||||
{
|
{
|
||||||
var nameValue = (NameValueCollection)o;
|
NameValueCollection nameValue = (NameValueCollection)o;
|
||||||
nameValue.Cast<string>()
|
nameValue.Cast<string>()
|
||||||
.Select(key => new KeyValuePair<string, object>(key, nameValue[key]))
|
.Select(key => new KeyValuePair<string, object>(key, nameValue[key]))
|
||||||
.ToList()
|
.ToList()
|
||||||
@@ -1031,19 +1040,19 @@ namespace DynamORM
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var mapper = DynamicMapperCache.GetMapper(ot);
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(ot);
|
||||||
|
|
||||||
if (mapper != null)
|
if (mapper != null)
|
||||||
{
|
{
|
||||||
foreach (var item in mapper.ColumnsMap.Values)
|
foreach (DynamicPropertyInvoker item in mapper.ColumnsMap.Values)
|
||||||
if (item.Get != null)
|
if (item.Get != null)
|
||||||
dict.Add(item.Name, item.Get(o));
|
dict.Add(item.Name, item.Get(o));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var props = ot.GetProperties();
|
PropertyInfo[] props = ot.GetProperties();
|
||||||
|
|
||||||
foreach (var item in props)
|
foreach (PropertyInfo item in props)
|
||||||
if (item.CanRead)
|
if (item.CanRead)
|
||||||
dict.Add(item.Name, item.GetValue(o, null));
|
dict.Add(item.Name, item.GetValue(o, null));
|
||||||
}
|
}
|
||||||
@@ -1057,13 +1066,13 @@ namespace DynamORM
|
|||||||
/// <returns>Converted object.</returns>
|
/// <returns>Converted object.</returns>
|
||||||
public static dynamic ToExpando(this object o)
|
public static dynamic ToExpando(this object o)
|
||||||
{
|
{
|
||||||
var ot = o.GetType();
|
Type ot = o.GetType();
|
||||||
|
|
||||||
if (ot == typeof(ExpandoObject) || ot == typeof(DynamicExpando))
|
if (ot == typeof(ExpandoObject) || ot == typeof(DynamicExpando))
|
||||||
return o;
|
return o;
|
||||||
|
|
||||||
var result = new ExpandoObject();
|
ExpandoObject result = new ExpandoObject();
|
||||||
var dict = (IDictionary<string, object>)result;
|
IDictionary<string, object> dict = (IDictionary<string, object>)result;
|
||||||
|
|
||||||
if (o is IDictionary<string, object>)
|
if (o is IDictionary<string, object>)
|
||||||
((IDictionary<string, object>)o)
|
((IDictionary<string, object>)o)
|
||||||
@@ -1071,7 +1080,7 @@ namespace DynamORM
|
|||||||
.ForEach(kvp => dict.Add(kvp.Key, kvp.Value));
|
.ForEach(kvp => dict.Add(kvp.Key, kvp.Value));
|
||||||
else if (ot == typeof(NameValueCollection) || ot.IsSubclassOf(typeof(NameValueCollection)))
|
else if (ot == typeof(NameValueCollection) || ot.IsSubclassOf(typeof(NameValueCollection)))
|
||||||
{
|
{
|
||||||
var nameValue = (NameValueCollection)o;
|
NameValueCollection nameValue = (NameValueCollection)o;
|
||||||
nameValue.Cast<string>()
|
nameValue.Cast<string>()
|
||||||
.Select(key => new KeyValuePair<string, object>(key, nameValue[key]))
|
.Select(key => new KeyValuePair<string, object>(key, nameValue[key]))
|
||||||
.ToList()
|
.ToList()
|
||||||
@@ -1079,19 +1088,19 @@ namespace DynamORM
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var mapper = DynamicMapperCache.GetMapper(ot);
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(ot);
|
||||||
|
|
||||||
if (mapper != null)
|
if (mapper != null)
|
||||||
{
|
{
|
||||||
foreach (var item in mapper.ColumnsMap.Values)
|
foreach (DynamicPropertyInvoker item in mapper.ColumnsMap.Values)
|
||||||
if (item.Get != null)
|
if (item.Get != null)
|
||||||
dict.Add(item.Name, item.Get(o));
|
dict.Add(item.Name, item.Get(o));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var props = ot.GetProperties();
|
PropertyInfo[] props = ot.GetProperties();
|
||||||
|
|
||||||
foreach (var item in props)
|
foreach (PropertyInfo item in props)
|
||||||
if (item.CanRead)
|
if (item.CanRead)
|
||||||
dict.Add(item.Name, item.GetValue(o, null));
|
dict.Add(item.Name, item.GetValue(o, null));
|
||||||
}
|
}
|
||||||
@@ -1179,7 +1188,7 @@ namespace DynamORM
|
|||||||
public static dynamic RowToDynamic(this IDataReader r)
|
public static dynamic RowToDynamic(this IDataReader r)
|
||||||
{
|
{
|
||||||
dynamic e = new DynamicExpando();
|
dynamic e = new DynamicExpando();
|
||||||
var d = e as IDictionary<string, object>;
|
IDictionary<string, object> d = e as IDictionary<string, object>;
|
||||||
|
|
||||||
int c = r.FieldCount;
|
int c = r.FieldCount;
|
||||||
for (int i = 0; i < c; i++)
|
for (int i = 0; i < c; i++)
|
||||||
@@ -1202,7 +1211,7 @@ namespace DynamORM
|
|||||||
public static dynamic RowToExpando(this IDataReader r)
|
public static dynamic RowToExpando(this IDataReader r)
|
||||||
{
|
{
|
||||||
dynamic e = new ExpandoObject();
|
dynamic e = new ExpandoObject();
|
||||||
var d = e as IDictionary<string, object>;
|
IDictionary<string, object> d = e as IDictionary<string, object>;
|
||||||
|
|
||||||
int c = r.FieldCount;
|
int c = r.FieldCount;
|
||||||
for (int i = 0; i < c; i++)
|
for (int i = 0; i < c; i++)
|
||||||
@@ -1331,7 +1340,7 @@ namespace DynamORM
|
|||||||
/// provided <see cref="System.Data.DbType"/>.</returns>
|
/// provided <see cref="System.Data.DbType"/>.</returns>
|
||||||
public static Type ToType(this DbType dbt)
|
public static Type ToType(this DbType dbt)
|
||||||
{
|
{
|
||||||
foreach (var tdbt in TypeMap)
|
foreach (KeyValuePair<Type, DbType> tdbt in TypeMap)
|
||||||
if (tdbt.Value == dbt)
|
if (tdbt.Value == dbt)
|
||||||
return tdbt.Key;
|
return tdbt.Key;
|
||||||
|
|
||||||
@@ -1414,12 +1423,12 @@ namespace DynamORM
|
|||||||
/// <returns>Enumerator of specified type.</returns>
|
/// <returns>Enumerator of specified type.</returns>
|
||||||
public static IEnumerable<T> MapEnumerable<T>(this IEnumerable<object> enumerable)
|
public static IEnumerable<T> MapEnumerable<T>(this IEnumerable<object> enumerable)
|
||||||
{
|
{
|
||||||
var mapper = DynamicMapperCache.GetMapper<T>();
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper<T>();
|
||||||
|
|
||||||
if (mapper == null)
|
if (mapper == null)
|
||||||
throw new InvalidOperationException("Type can't be mapped for unknown reason.");
|
throw new InvalidOperationException("Type can't be mapped for unknown reason.");
|
||||||
|
|
||||||
foreach (var item in enumerable)
|
foreach (object item in enumerable)
|
||||||
yield return (T)mapper.Create(item);
|
yield return (T)mapper.Create(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1429,7 +1438,7 @@ namespace DynamORM
|
|||||||
/// <returns>Item of specified type.</returns>
|
/// <returns>Item of specified type.</returns>
|
||||||
public static T Map<T>(this object item)
|
public static T Map<T>(this object item)
|
||||||
{
|
{
|
||||||
var mapper = DynamicMapperCache.GetMapper<T>();
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper<T>();
|
||||||
|
|
||||||
if (mapper == null)
|
if (mapper == null)
|
||||||
throw new InvalidOperationException("Type can't be mapped for unknown reason.");
|
throw new InvalidOperationException("Type can't be mapped for unknown reason.");
|
||||||
@@ -1444,7 +1453,7 @@ namespace DynamORM
|
|||||||
/// <returns>Filled item.</returns>
|
/// <returns>Filled item.</returns>
|
||||||
public static T Fill<T>(this T item, object source)
|
public static T Fill<T>(this T item, object source)
|
||||||
{
|
{
|
||||||
var mapper = DynamicMapperCache.GetMapper<T>();
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper<T>();
|
||||||
|
|
||||||
if (mapper == null)
|
if (mapper == null)
|
||||||
throw new InvalidOperationException("Type can't be mapped for unknown reason.");
|
throw new InvalidOperationException("Type can't be mapped for unknown reason.");
|
||||||
@@ -1460,12 +1469,12 @@ namespace DynamORM
|
|||||||
/// <returns>Enumerator of specified type.</returns>
|
/// <returns>Enumerator of specified type.</returns>
|
||||||
public static IEnumerable<object> MapEnumerable(this IEnumerable<object> enumerable, Type type)
|
public static IEnumerable<object> MapEnumerable(this IEnumerable<object> enumerable, Type type)
|
||||||
{
|
{
|
||||||
var mapper = DynamicMapperCache.GetMapper(type);
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(type);
|
||||||
|
|
||||||
if (mapper == null)
|
if (mapper == null)
|
||||||
throw new InvalidOperationException("Type can't be mapped for unknown reason.");
|
throw new InvalidOperationException("Type can't be mapped for unknown reason.");
|
||||||
|
|
||||||
foreach (var item in enumerable)
|
foreach (object item in enumerable)
|
||||||
yield return mapper.Create(item);
|
yield return mapper.Create(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1475,7 +1484,7 @@ namespace DynamORM
|
|||||||
/// <returns>Item of specified type.</returns>
|
/// <returns>Item of specified type.</returns>
|
||||||
public static object Map(this object item, Type type)
|
public static object Map(this object item, Type type)
|
||||||
{
|
{
|
||||||
var mapper = DynamicMapperCache.GetMapper(type);
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(type);
|
||||||
|
|
||||||
if (mapper == null)
|
if (mapper == null)
|
||||||
throw new InvalidOperationException("Type can't be mapped for unknown reason.");
|
throw new InvalidOperationException("Type can't be mapped for unknown reason.");
|
||||||
|
|||||||
@@ -267,7 +267,7 @@ namespace DynamORM
|
|||||||
Database = database;
|
Database = database;
|
||||||
TableType = type;
|
TableType = type;
|
||||||
|
|
||||||
var mapper = DynamicMapperCache.GetMapper(type);
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(type);
|
||||||
|
|
||||||
if (mapper != null)
|
if (mapper != null)
|
||||||
{
|
{
|
||||||
@@ -293,11 +293,11 @@ namespace DynamORM
|
|||||||
|
|
||||||
if (keys == null && TableType != null)
|
if (keys == null && TableType != null)
|
||||||
{
|
{
|
||||||
var mapper = DynamicMapperCache.GetMapper(TableType);
|
DynamicTypeMap mapper = DynamicMapperCache.GetMapper(TableType);
|
||||||
|
|
||||||
if (mapper != null)
|
if (mapper != null)
|
||||||
{
|
{
|
||||||
var k = mapper.ColumnsMap.Where(p => p.Value.Column != null && p.Value.Column.IsKey).Select(p => p.Key);
|
IEnumerable<string> k = mapper.ColumnsMap.Where(p => p.Value.Column != null && p.Value.Column.IsKey).Select(p => p.Key);
|
||||||
if (k.Count() > 0)
|
if (k.Count() > 0)
|
||||||
keys = k.ToArray();
|
keys = k.ToArray();
|
||||||
}
|
}
|
||||||
@@ -361,9 +361,9 @@ namespace DynamORM
|
|||||||
/// <returns>New <see cref="DynamicSelectQueryBuilder"/> instance.</returns>
|
/// <returns>New <see cref="DynamicSelectQueryBuilder"/> instance.</returns>
|
||||||
public virtual IDynamicSelectQueryBuilder Query()
|
public virtual IDynamicSelectQueryBuilder Query()
|
||||||
{
|
{
|
||||||
var builder = new DynamicSelectQueryBuilder(this.Database);
|
IDynamicSelectQueryBuilder builder = new DynamicSelectQueryBuilder(this.Database);
|
||||||
|
|
||||||
var name = this.FullName;
|
string name = this.FullName;
|
||||||
if (!string.IsNullOrEmpty(name))
|
if (!string.IsNullOrEmpty(name))
|
||||||
builder.From(x => name);
|
builder.From(x => name);
|
||||||
|
|
||||||
@@ -575,16 +575,16 @@ namespace DynamORM
|
|||||||
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
|
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
|
||||||
{
|
{
|
||||||
// parse the method
|
// parse the method
|
||||||
var info = binder.CallInfo;
|
CallInfo info = binder.CallInfo;
|
||||||
|
|
||||||
// Get generic types
|
// Get generic types
|
||||||
var types = binder.GetGenericTypeArguments();
|
IList<Type> types = binder.GetGenericTypeArguments();
|
||||||
|
|
||||||
// accepting named args only... SKEET!
|
// accepting named args only... SKEET!
|
||||||
if (info.ArgumentNames.Count != args.Length)
|
if (info.ArgumentNames.Count != args.Length)
|
||||||
throw new InvalidOperationException("Please use named arguments for this type of query - the column name, orderby, columns, etc");
|
throw new InvalidOperationException("Please use named arguments for this type of query - the column name, orderby, columns, etc");
|
||||||
|
|
||||||
var op = binder.Name;
|
string op = binder.Name;
|
||||||
|
|
||||||
// Avoid strange things
|
// Avoid strange things
|
||||||
if (!_allowedCommands.Contains(op))
|
if (!_allowedCommands.Contains(op))
|
||||||
@@ -614,7 +614,7 @@ namespace DynamORM
|
|||||||
|
|
||||||
private object DynamicInsert(object[] args, CallInfo info, IList<Type> types)
|
private object DynamicInsert(object[] args, CallInfo info, IList<Type> types)
|
||||||
{
|
{
|
||||||
var builder = new DynamicInsertQueryBuilder(this.Database);
|
DynamicInsertQueryBuilder builder = new DynamicInsertQueryBuilder(this.Database);
|
||||||
|
|
||||||
if (types != null && types.Count == 1)
|
if (types != null && types.Count == 1)
|
||||||
HandleTypeArgument<DynamicInsertQueryBuilder>(null, info, ref types, builder, 0);
|
HandleTypeArgument<DynamicInsertQueryBuilder>(null, info, ref types, builder, 0);
|
||||||
@@ -627,8 +627,8 @@ namespace DynamORM
|
|||||||
{
|
{
|
||||||
for (int i = 0; i < args.Length; i++)
|
for (int i = 0; i < args.Length; i++)
|
||||||
{
|
{
|
||||||
var fullName = info.ArgumentNames[i];
|
string fullName = info.ArgumentNames[i];
|
||||||
var name = fullName.ToLower();
|
string name = fullName.ToLower();
|
||||||
|
|
||||||
switch (name)
|
switch (name)
|
||||||
{
|
{
|
||||||
@@ -661,7 +661,7 @@ namespace DynamORM
|
|||||||
|
|
||||||
private object DynamicUpdate(object[] args, CallInfo info, IList<Type> types)
|
private object DynamicUpdate(object[] args, CallInfo info, IList<Type> types)
|
||||||
{
|
{
|
||||||
var builder = new DynamicUpdateQueryBuilder(this.Database);
|
DynamicUpdateQueryBuilder builder = new DynamicUpdateQueryBuilder(this.Database);
|
||||||
|
|
||||||
if (types != null && types.Count == 1)
|
if (types != null && types.Count == 1)
|
||||||
HandleTypeArgument<DynamicUpdateQueryBuilder>(null, info, ref types, builder, 0);
|
HandleTypeArgument<DynamicUpdateQueryBuilder>(null, info, ref types, builder, 0);
|
||||||
@@ -674,8 +674,8 @@ namespace DynamORM
|
|||||||
{
|
{
|
||||||
for (int i = 0; i < args.Length; i++)
|
for (int i = 0; i < args.Length; i++)
|
||||||
{
|
{
|
||||||
var fullName = info.ArgumentNames[i];
|
string fullName = info.ArgumentNames[i];
|
||||||
var name = fullName.ToLower();
|
string name = fullName.ToLower();
|
||||||
|
|
||||||
switch (name)
|
switch (name)
|
||||||
{
|
{
|
||||||
@@ -716,7 +716,7 @@ namespace DynamORM
|
|||||||
|
|
||||||
private object DynamicDelete(object[] args, CallInfo info, IList<Type> types)
|
private object DynamicDelete(object[] args, CallInfo info, IList<Type> types)
|
||||||
{
|
{
|
||||||
var builder = new DynamicDeleteQueryBuilder(this.Database);
|
DynamicDeleteQueryBuilder builder = new DynamicDeleteQueryBuilder(this.Database);
|
||||||
|
|
||||||
if (types != null && types.Count == 1)
|
if (types != null && types.Count == 1)
|
||||||
HandleTypeArgument<DynamicDeleteQueryBuilder>(null, info, ref types, builder, 0);
|
HandleTypeArgument<DynamicDeleteQueryBuilder>(null, info, ref types, builder, 0);
|
||||||
@@ -729,8 +729,8 @@ namespace DynamORM
|
|||||||
{
|
{
|
||||||
for (int i = 0; i < args.Length; i++)
|
for (int i = 0; i < args.Length; i++)
|
||||||
{
|
{
|
||||||
var fullName = info.ArgumentNames[i];
|
string fullName = info.ArgumentNames[i];
|
||||||
var name = fullName.ToLower();
|
string name = fullName.ToLower();
|
||||||
|
|
||||||
switch (name)
|
switch (name)
|
||||||
{
|
{
|
||||||
@@ -768,7 +768,7 @@ namespace DynamORM
|
|||||||
private object DynamicQuery(object[] args, CallInfo info, string op, IList<Type> types)
|
private object DynamicQuery(object[] args, CallInfo info, string op, IList<Type> types)
|
||||||
{
|
{
|
||||||
object result;
|
object result;
|
||||||
var builder = new DynamicSelectQueryBuilder(this.Database);
|
DynamicSelectQueryBuilder builder = new DynamicSelectQueryBuilder(this.Database);
|
||||||
|
|
||||||
if (types != null && types.Count == 1)
|
if (types != null && types.Count == 1)
|
||||||
HandleTypeArgument<DynamicSelectQueryBuilder>(null, info, ref types, builder, 0);
|
HandleTypeArgument<DynamicSelectQueryBuilder>(null, info, ref types, builder, 0);
|
||||||
@@ -781,8 +781,8 @@ namespace DynamORM
|
|||||||
{
|
{
|
||||||
for (int i = 0; i < args.Length; i++)
|
for (int i = 0; i < args.Length; i++)
|
||||||
{
|
{
|
||||||
var fullName = info.ArgumentNames[i];
|
string fullName = info.ArgumentNames[i];
|
||||||
var name = fullName.ToLower();
|
string name = fullName.ToLower();
|
||||||
|
|
||||||
// TODO: Make this nicer
|
// TODO: Make this nicer
|
||||||
switch (name)
|
switch (name)
|
||||||
@@ -813,14 +813,14 @@ namespace DynamORM
|
|||||||
|
|
||||||
case "columns":
|
case "columns":
|
||||||
{
|
{
|
||||||
var agregate = (op == "Sum" || op == "Max" || op == "Min" || op == "Avg" || op == "Count") ?
|
string agregate = (op == "Sum" || op == "Max" || op == "Min" || op == "Avg" || op == "Count") ?
|
||||||
op.ToUpper() : null;
|
op.ToUpper() : null;
|
||||||
|
|
||||||
if (args[i] is string || args[i] is string[])
|
if (args[i] is string || args[i] is string[])
|
||||||
builder.SelectColumn((args[i] as String).NullOr(s => s.Split(','), args[i] as String[])
|
builder.SelectColumn((args[i] as String).NullOr(s => s.Split(','), args[i] as String[])
|
||||||
.Select(c =>
|
.Select(c =>
|
||||||
{
|
{
|
||||||
var col = DynamicColumn.ParseSelectColumn(c);
|
DynamicColumn col = DynamicColumn.ParseSelectColumn(c);
|
||||||
if (string.IsNullOrEmpty(col.Aggregate))
|
if (string.IsNullOrEmpty(col.Aggregate))
|
||||||
col.Aggregate = agregate;
|
col.Aggregate = agregate;
|
||||||
|
|
||||||
@@ -886,17 +886,9 @@ namespace DynamORM
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// build the SQL
|
// build the SQL
|
||||||
var justOne = op == "First" || op == "Last" || op == "Get" || op == "Single";
|
bool justOne = op == "First" || op == "Last" || op == "Get" || op == "Single";
|
||||||
|
|
||||||
// Be sure to sort by DESC on selected columns
|
// Be sure to sort by DESC on selected columns
|
||||||
/*if (op == "Last")
|
|
||||||
{
|
|
||||||
if (builder.Order.Count > 0)
|
|
||||||
foreach (var o in builder.Order)
|
|
||||||
o.Order = o.Order == DynamicColumn.SortOrder.Desc ?
|
|
||||||
DynamicColumn.SortOrder.Asc : DynamicColumn.SortOrder.Desc;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if (justOne && !(op == "Last"))
|
if (justOne && !(op == "Last"))
|
||||||
{
|
{
|
||||||
if ((Database.Options & DynamicDatabaseOptions.SupportLimitOffset) == DynamicDatabaseOptions.SupportLimitOffset)
|
if ((Database.Options & DynamicDatabaseOptions.SupportLimitOffset) == DynamicDatabaseOptions.SupportLimitOffset)
|
||||||
|
|||||||
@@ -27,8 +27,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
using DynamORM.Helpers;
|
using DynamORM.Helpers;
|
||||||
|
|
||||||
namespace DynamORM
|
namespace DynamORM
|
||||||
@@ -66,7 +69,7 @@ namespace DynamORM
|
|||||||
{
|
{
|
||||||
if (customParams != null)
|
if (customParams != null)
|
||||||
{
|
{
|
||||||
var mi = _con.Connection.GetType().GetMethods().Where(m => m.GetParameters().Count() == 1 && m.GetParameters().First().ParameterType == customParams.GetType()).FirstOrDefault();
|
MethodInfo mi = _con.Connection.GetType().GetMethods().Where(m => m.GetParameters().Count() == 1 && m.GetParameters().First().ParameterType == customParams.GetType()).FirstOrDefault();
|
||||||
if (mi != null)
|
if (mi != null)
|
||||||
_db.TransactionPool[_con.Connection].Push((IDbTransaction)mi.Invoke(_con.Connection, new object[] { customParams, }));
|
_db.TransactionPool[_con.Connection].Push((IDbTransaction)mi.Invoke(_con.Connection, new object[] { customParams, }));
|
||||||
else
|
else
|
||||||
@@ -90,7 +93,7 @@ namespace DynamORM
|
|||||||
{
|
{
|
||||||
if (_operational)
|
if (_operational)
|
||||||
{
|
{
|
||||||
var t = _db.TransactionPool.TryGetValue(_con.Connection);
|
Stack<IDbTransaction> t = _db.TransactionPool.TryGetValue(_con.Connection);
|
||||||
|
|
||||||
if (t != null && t.Count > 0)
|
if (t != null && t.Count > 0)
|
||||||
{
|
{
|
||||||
@@ -114,7 +117,7 @@ namespace DynamORM
|
|||||||
{
|
{
|
||||||
if (_operational)
|
if (_operational)
|
||||||
{
|
{
|
||||||
var t = _db.TransactionPool.TryGetValue(_con.Connection);
|
Stack<IDbTransaction> t = _db.TransactionPool.TryGetValue(_con.Connection);
|
||||||
|
|
||||||
if (t != null && t.Count > 0)
|
if (t != null && t.Count > 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -91,13 +91,13 @@ namespace DynamORM.Helpers
|
|||||||
int firstCount;
|
int firstCount;
|
||||||
int secondCount;
|
int secondCount;
|
||||||
|
|
||||||
var firstElementCounts = GetElementCounts(first, out firstCount);
|
Dictionary<T, int> firstElementCounts = GetElementCounts(first, out firstCount);
|
||||||
var secondElementCounts = GetElementCounts(second, out secondCount);
|
Dictionary<T, int> secondElementCounts = GetElementCounts(second, out secondCount);
|
||||||
|
|
||||||
if (firstCount != secondCount)
|
if (firstCount != secondCount)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
foreach (var kvp in firstElementCounts)
|
foreach (KeyValuePair<T, int> kvp in firstElementCounts)
|
||||||
if (kvp.Value != (secondElementCounts.TryGetNullable(kvp.Key) ?? 0))
|
if (kvp.Value != (secondElementCounts.TryGetNullable(kvp.Key) ?? 0))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@ namespace DynamORM.Helpers
|
|||||||
|
|
||||||
private static Dictionary<T, int> GetElementCounts(IEnumerable<T> enumerable, out int nullCount)
|
private static Dictionary<T, int> GetElementCounts(IEnumerable<T> enumerable, out int nullCount)
|
||||||
{
|
{
|
||||||
var dictionary = new Dictionary<T, int>();
|
Dictionary<T, int> dictionary = new Dictionary<T, int>();
|
||||||
nullCount = 0;
|
nullCount = 0;
|
||||||
|
|
||||||
foreach (T element in enumerable)
|
foreach (T element in enumerable)
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Dynamic;
|
using System.Dynamic;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
|
using System.Reflection;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -77,12 +78,12 @@ namespace DynamORM.Helpers.Dynamics
|
|||||||
// Func was cool but caused memory leaks
|
// Func was cool but caused memory leaks
|
||||||
private DynamicMetaObject GetBinder(Node node)
|
private DynamicMetaObject GetBinder(Node node)
|
||||||
{
|
{
|
||||||
var o = (Node)this.Value;
|
Node o = (Node)this.Value;
|
||||||
node.Parser = o.Parser;
|
node.Parser = o.Parser;
|
||||||
o.Parser.Last = node;
|
o.Parser.Last = node;
|
||||||
|
|
||||||
var p = Expression.Variable(typeof(Node), "ret");
|
ParameterExpression p = Expression.Variable(typeof(Node), "ret");
|
||||||
var exp = Expression.Block(new ParameterExpression[] { p }, Expression.Assign(p, Expression.Constant(node)));
|
BlockExpression exp = Expression.Block(new ParameterExpression[] { p }, Expression.Assign(p, Expression.Constant(node)));
|
||||||
|
|
||||||
return new MetaNode(exp, this.Restrictions, node);
|
return new MetaNode(exp, this.Restrictions, node);
|
||||||
}
|
}
|
||||||
@@ -187,8 +188,8 @@ namespace DynamORM.Helpers.Dynamics
|
|||||||
/// </returns>
|
/// </returns>
|
||||||
public override DynamicMetaObject BindUnaryOperation(UnaryOperationBinder binder)
|
public override DynamicMetaObject BindUnaryOperation(UnaryOperationBinder binder)
|
||||||
{
|
{
|
||||||
var o = (Node)this.Value;
|
Node o = (Node)this.Value;
|
||||||
var node = new Unary(o, binder.Operation) { Parser = o.Parser };
|
Unary node = new Unary(o, binder.Operation) { Parser = o.Parser };
|
||||||
o.Parser.Last = node;
|
o.Parser.Last = node;
|
||||||
|
|
||||||
// If operation is 'IsTrue' or 'IsFalse', we will return false to keep the engine working...
|
// If operation is 'IsTrue' or 'IsFalse', we will return false to keep the engine working...
|
||||||
@@ -196,8 +197,8 @@ namespace DynamORM.Helpers.Dynamics
|
|||||||
if (binder.Operation == ExpressionType.IsTrue) ret = (object)false;
|
if (binder.Operation == ExpressionType.IsTrue) ret = (object)false;
|
||||||
if (binder.Operation == ExpressionType.IsFalse) ret = (object)false;
|
if (binder.Operation == ExpressionType.IsFalse) ret = (object)false;
|
||||||
|
|
||||||
var p = Expression.Variable(ret.GetType(), "ret"); // the type is now obtained from "ret"
|
ParameterExpression p = Expression.Variable(ret.GetType(), "ret"); // the type is now obtained from "ret"
|
||||||
var exp = Expression.Block(
|
BlockExpression exp = Expression.Block(
|
||||||
new ParameterExpression[] { p },
|
new ParameterExpression[] { p },
|
||||||
Expression.Assign(p, Expression.Constant(ret))); // the expression is now obtained from "ret"
|
Expression.Assign(p, Expression.Constant(ret))); // the expression is now obtained from "ret"
|
||||||
|
|
||||||
@@ -213,8 +214,8 @@ namespace DynamORM.Helpers.Dynamics
|
|||||||
/// </returns>
|
/// </returns>
|
||||||
public override DynamicMetaObject BindConvert(ConvertBinder binder)
|
public override DynamicMetaObject BindConvert(ConvertBinder binder)
|
||||||
{
|
{
|
||||||
var o = (Node)this.Value;
|
Node o = (Node)this.Value;
|
||||||
var node = new Convert(o, binder.ReturnType) { Parser = o.Parser };
|
Convert node = new Convert(o, binder.ReturnType) { Parser = o.Parser };
|
||||||
o.Parser.Last = node;
|
o.Parser.Last = node;
|
||||||
|
|
||||||
// Reducing the object to return if this is an assignment node...
|
// Reducing the object to return if this is an assignment node...
|
||||||
@@ -249,8 +250,8 @@ namespace DynamORM.Helpers.Dynamics
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var p = Expression.Variable(binder.ReturnType, "ret");
|
ParameterExpression p = Expression.Variable(binder.ReturnType, "ret");
|
||||||
var exp = Expression.Block(
|
BlockExpression exp = Expression.Block(
|
||||||
new ParameterExpression[] { p },
|
new ParameterExpression[] { p },
|
||||||
Expression.Assign(p, Expression.Constant(ret, binder.ReturnType))); // specifying binder.ReturnType
|
Expression.Assign(p, Expression.Constant(ret, binder.ReturnType))); // specifying binder.ReturnType
|
||||||
|
|
||||||
@@ -1102,7 +1103,7 @@ namespace DynamORM.Helpers.Dynamics
|
|||||||
if (!IsDisposed && _arguments != null)
|
if (!IsDisposed && _arguments != null)
|
||||||
list.AddRange(_arguments);
|
list.AddRange(_arguments);
|
||||||
|
|
||||||
foreach (var arg in list)
|
foreach (Node.Argument arg in list)
|
||||||
yield return arg;
|
yield return arg;
|
||||||
|
|
||||||
list.Clear();
|
list.Clear();
|
||||||
@@ -1134,13 +1135,13 @@ namespace DynamORM.Helpers.Dynamics
|
|||||||
{
|
{
|
||||||
// I know this can be almost a one liner
|
// I know this can be almost a one liner
|
||||||
// but it causes memory leaks when so.
|
// but it causes memory leaks when so.
|
||||||
var pars = f.Method.GetParameters();
|
ParameterInfo[] pars = f.Method.GetParameters();
|
||||||
foreach (var p in pars)
|
foreach (ParameterInfo p in pars)
|
||||||
{
|
{
|
||||||
var attrs = p.GetCustomAttributes(typeof(DynamicAttribute), true).Length;
|
int attrs = p.GetCustomAttributes(typeof(DynamicAttribute), true).Length;
|
||||||
if (attrs != 0)
|
if (attrs != 0)
|
||||||
{
|
{
|
||||||
var par = new Node.Argument(p.Name) { Parser = this };
|
Node.Argument par = new Node.Argument(p.Name) { Parser = this };
|
||||||
this._arguments.Add(par);
|
this._arguments.Add(par);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1176,7 +1177,7 @@ namespace DynamORM.Helpers.Dynamics
|
|||||||
|
|
||||||
if (_arguments != null)
|
if (_arguments != null)
|
||||||
{
|
{
|
||||||
foreach (var arg in _arguments)
|
foreach (Node.Argument arg in _arguments)
|
||||||
{
|
{
|
||||||
if (!first) sb.Append(", "); else first = false;
|
if (!first) sb.Append(", "); else first = false;
|
||||||
sb.Append(arg);
|
sb.Append(arg);
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ namespace DynamORM.Helpers.Dynamics
|
|||||||
_proxy = proxiedObject;
|
_proxy = proxiedObject;
|
||||||
_type = typeof(T);
|
_type = typeof(T);
|
||||||
|
|
||||||
var mapper = Mapper.DynamicMapperCache.GetMapper<T>();
|
DynamicTypeMap mapper = Mapper.DynamicMapperCache.GetMapper<T>();
|
||||||
|
|
||||||
_properties = mapper
|
_properties = mapper
|
||||||
.ColumnsMap
|
.ColumnsMap
|
||||||
@@ -146,7 +146,7 @@ namespace DynamORM.Helpers.Dynamics
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var prop = _properties.TryGetValue(binder.Name);
|
DynamicPropertyInvoker prop = _properties.TryGetValue(binder.Name);
|
||||||
|
|
||||||
result = prop.NullOr(p => p.Get.NullOr(g => g(_proxy), null), null);
|
result = prop.NullOr(p => p.Get.NullOr(g => g(_proxy), null), null);
|
||||||
|
|
||||||
@@ -181,7 +181,7 @@ namespace DynamORM.Helpers.Dynamics
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var prop = _properties.TryGetValue(binder.Name);
|
DynamicPropertyInvoker prop = _properties.TryGetValue(binder.Name);
|
||||||
|
|
||||||
if (prop != null && prop.Setter != null)
|
if (prop != null && prop.Setter != null)
|
||||||
{
|
{
|
||||||
@@ -278,18 +278,17 @@ namespace DynamORM.Helpers.Dynamics
|
|||||||
{
|
{
|
||||||
if (type.IsInterface)
|
if (type.IsInterface)
|
||||||
{
|
{
|
||||||
var members = new List<MemberInfo>();
|
List<MemberInfo> members = new List<MemberInfo>();
|
||||||
|
List<Type> considered = new List<Type>();
|
||||||
var considered = new List<Type>();
|
Queue<Type> queue = new Queue<Type>();
|
||||||
var queue = new Queue<Type>();
|
|
||||||
|
|
||||||
considered.Add(type);
|
considered.Add(type);
|
||||||
queue.Enqueue(type);
|
queue.Enqueue(type);
|
||||||
|
|
||||||
while (queue.Count > 0)
|
while (queue.Count > 0)
|
||||||
{
|
{
|
||||||
var subType = queue.Dequeue();
|
Type subType = queue.Dequeue();
|
||||||
foreach (var subInterface in subType.GetInterfaces())
|
foreach (Type subInterface in subType.GetInterfaces())
|
||||||
{
|
{
|
||||||
if (considered.Contains(subInterface)) continue;
|
if (considered.Contains(subInterface)) continue;
|
||||||
|
|
||||||
@@ -297,12 +296,12 @@ namespace DynamORM.Helpers.Dynamics
|
|||||||
queue.Enqueue(subInterface);
|
queue.Enqueue(subInterface);
|
||||||
}
|
}
|
||||||
|
|
||||||
var typeProperties = subType.GetMembers(
|
MemberInfo[] typeProperties = subType.GetMembers(
|
||||||
BindingFlags.FlattenHierarchy
|
BindingFlags.FlattenHierarchy
|
||||||
| BindingFlags.Public
|
| BindingFlags.Public
|
||||||
| BindingFlags.Instance);
|
| BindingFlags.Instance);
|
||||||
|
|
||||||
var newPropertyInfos = typeProperties
|
IEnumerable<MemberInfo> newPropertyInfos = typeProperties
|
||||||
.Where(x => !members.Contains(x));
|
.Where(x => !members.Contains(x));
|
||||||
|
|
||||||
members.InsertRange(0, newPropertyInfos);
|
members.InsertRange(0, newPropertyInfos);
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ namespace DynamORM.Helpers
|
|||||||
// HACK: Creating binders assuming types are correct... this may fail.
|
// HACK: Creating binders assuming types are correct... this may fail.
|
||||||
if (IsMono)
|
if (IsMono)
|
||||||
{
|
{
|
||||||
var binderType = typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).Assembly.GetType("Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder");
|
Type binderType = typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).Assembly.GetType("Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder");
|
||||||
|
|
||||||
if (binderType != null)
|
if (binderType != null)
|
||||||
{
|
{
|
||||||
@@ -76,16 +76,16 @@ namespace DynamORM.Helpers
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var inter = typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).Assembly.GetType("Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder");
|
Type inter = typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).Assembly.GetType("Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder");
|
||||||
|
|
||||||
if (inter != null)
|
if (inter != null)
|
||||||
{
|
{
|
||||||
var prop = inter.GetProperty("TypeArguments");
|
PropertyInfo prop = inter.GetProperty("TypeArguments");
|
||||||
|
|
||||||
if (!prop.CanRead)
|
if (!prop.CanRead)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var objParm = Expression.Parameter(typeof(InvokeMemberBinder), "o");
|
ParameterExpression objParm = Expression.Parameter(typeof(InvokeMemberBinder), "o");
|
||||||
|
|
||||||
return Expression.Lambda<Func<InvokeMemberBinder, IList<Type>>>(
|
return Expression.Lambda<Func<InvokeMemberBinder, IList<Type>>>(
|
||||||
Expression.TypeAs(
|
Expression.TypeAs(
|
||||||
@@ -121,7 +121,7 @@ namespace DynamORM.Helpers
|
|||||||
// In mono this is trivial.
|
// In mono this is trivial.
|
||||||
|
|
||||||
// First we get field info.
|
// First we get field info.
|
||||||
var field = binder.GetType().GetField("typeArguments", BindingFlags.Instance |
|
FieldInfo field = binder.GetType().GetField("typeArguments", BindingFlags.Instance |
|
||||||
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
|
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
|
||||||
|
|
||||||
// If this was a success get and return it's value
|
// If this was a success get and return it's value
|
||||||
@@ -134,12 +134,12 @@ namespace DynamORM.Helpers
|
|||||||
// In this case, we need more aerobic :D
|
// In this case, we need more aerobic :D
|
||||||
|
|
||||||
// First, get the interface
|
// First, get the interface
|
||||||
var inter = binder.GetType().GetInterface("Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder");
|
Type inter = binder.GetType().GetInterface("Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder");
|
||||||
|
|
||||||
if (inter != null)
|
if (inter != null)
|
||||||
{
|
{
|
||||||
// Now get property.
|
// Now get property.
|
||||||
var prop = inter.GetProperty("TypeArguments");
|
PropertyInfo prop = inter.GetProperty("TypeArguments");
|
||||||
|
|
||||||
// If we have a property, return it's value
|
// If we have a property, return it's value
|
||||||
if (prop != null)
|
if (prop != null)
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ namespace DynamORM.Helpers
|
|||||||
|
|
||||||
if (props.Length != 0)
|
if (props.Length != 0)
|
||||||
{
|
{
|
||||||
foreach (var prop in props)
|
foreach (PropertyInfo prop in props)
|
||||||
{
|
{
|
||||||
if (!first) sb.Append(", "); else first = false;
|
if (!first) sb.Append(", "); else first = false;
|
||||||
sb.AppendFormat("{0}='{1}'", prop.Name, prop.GetValue(obj, null).Sketch());
|
sb.AppendFormat("{0}='{1}'", prop.Name, prop.GetValue(obj, null).Sketch());
|
||||||
@@ -156,7 +156,7 @@ namespace DynamORM.Helpers
|
|||||||
{
|
{
|
||||||
if (infos.Length != 0)
|
if (infos.Length != 0)
|
||||||
{
|
{
|
||||||
foreach (var info in infos)
|
foreach (FieldInfo info in infos)
|
||||||
{
|
{
|
||||||
if (!first) sb.Append(", "); else first = false;
|
if (!first) sb.Append(", "); else first = false;
|
||||||
sb.AppendFormat("{0}='{1}'", info.Name, info.GetValue(obj).Sketch());
|
sb.AppendFormat("{0}='{1}'", info.Name, info.GetValue(obj).Sketch());
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ namespace DynamORM.Mapper
|
|||||||
Name = property.Name;
|
Name = property.Name;
|
||||||
Type = property.PropertyType;
|
Type = property.PropertyType;
|
||||||
|
|
||||||
var ignore = property.GetCustomAttributes(typeof(IgnoreAttribute), false);
|
object[] ignore = property.GetCustomAttributes(typeof(IgnoreAttribute), false);
|
||||||
|
|
||||||
Ignore = ignore != null && ignore.Length > 0;
|
Ignore = ignore != null && ignore.Length > 0;
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ namespace DynamORM.Mapper
|
|||||||
if (!property.CanRead)
|
if (!property.CanRead)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var objParm = Expression.Parameter(typeof(object), "o");
|
ParameterExpression objParm = Expression.Parameter(typeof(object), "o");
|
||||||
|
|
||||||
return Expression.Lambda<Func<object, object>>(
|
return Expression.Lambda<Func<object, object>>(
|
||||||
Expression.Convert(
|
Expression.Convert(
|
||||||
@@ -104,8 +104,8 @@ namespace DynamORM.Mapper
|
|||||||
if (!property.CanWrite)
|
if (!property.CanWrite)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var objParm = Expression.Parameter(typeof(object), "o");
|
ParameterExpression objParm = Expression.Parameter(typeof(object), "o");
|
||||||
var valueParm = Expression.Parameter(typeof(object), "value");
|
ParameterExpression valueParm = Expression.Parameter(typeof(object), "value");
|
||||||
|
|
||||||
return Expression.Lambda<Action<object, object>>(
|
return Expression.Lambda<Action<object, object>>(
|
||||||
Expression.Assign(
|
Expression.Assign(
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ namespace DynamORM.Mapper
|
|||||||
{
|
{
|
||||||
Type = type;
|
Type = type;
|
||||||
|
|
||||||
var attr = type.GetCustomAttributes(typeof(TableAttribute), false);
|
object[] attr = type.GetCustomAttributes(typeof(TableAttribute), false);
|
||||||
|
|
||||||
if (attr != null && attr.Length > 0)
|
if (attr != null && attr.Length > 0)
|
||||||
Table = (TableAttribute)attr[0];
|
Table = (TableAttribute)attr[0];
|
||||||
@@ -74,22 +74,22 @@ namespace DynamORM.Mapper
|
|||||||
|
|
||||||
private void CreateColumnAndPropertyMap()
|
private void CreateColumnAndPropertyMap()
|
||||||
{
|
{
|
||||||
var columnMap = new Dictionary<string, DynamicPropertyInvoker>();
|
Dictionary<string, DynamicPropertyInvoker> columnMap = new Dictionary<string, DynamicPropertyInvoker>();
|
||||||
var propertyMap = new Dictionary<string, string>();
|
Dictionary<string, string> propertyMap = new Dictionary<string, string>();
|
||||||
var ignored = new List<string>();
|
List<string> ignored = new List<string>();
|
||||||
|
|
||||||
foreach (var pi in GetAllMembers(Type).Where(x => x is PropertyInfo).Cast<PropertyInfo>())
|
foreach (PropertyInfo pi in GetAllMembers(Type).Where(x => x is PropertyInfo).Cast<PropertyInfo>())
|
||||||
{
|
{
|
||||||
ColumnAttribute attr = null;
|
ColumnAttribute attr = null;
|
||||||
|
|
||||||
var attrs = pi.GetCustomAttributes(typeof(ColumnAttribute), true);
|
object[] attrs = pi.GetCustomAttributes(typeof(ColumnAttribute), true);
|
||||||
|
|
||||||
if (attrs != null && attrs.Length > 0)
|
if (attrs != null && attrs.Length > 0)
|
||||||
attr = (ColumnAttribute)attrs[0];
|
attr = (ColumnAttribute)attrs[0];
|
||||||
|
|
||||||
string col = attr == null || string.IsNullOrEmpty(attr.Name) ? pi.Name : attr.Name;
|
string col = attr == null || string.IsNullOrEmpty(attr.Name) ? pi.Name : attr.Name;
|
||||||
|
|
||||||
var val = new DynamicPropertyInvoker(pi, attr);
|
DynamicPropertyInvoker val = new DynamicPropertyInvoker(pi, attr);
|
||||||
columnMap.Add(col.ToLower(), val);
|
columnMap.Add(col.ToLower(), val);
|
||||||
|
|
||||||
propertyMap.Add(pi.Name, col);
|
propertyMap.Add(pi.Name, col);
|
||||||
@@ -128,7 +128,7 @@ namespace DynamORM.Mapper
|
|||||||
{
|
{
|
||||||
DynamicPropertyInvoker dpi = null;
|
DynamicPropertyInvoker dpi = null;
|
||||||
|
|
||||||
foreach (var item in source.ToDictionary())
|
foreach (KeyValuePair<string, object> item in source.ToDictionary())
|
||||||
{
|
{
|
||||||
if (ColumnsMap.TryGetValue(item.Key.ToLower(), out dpi) && item.Value != null)
|
if (ColumnsMap.TryGetValue(item.Key.ToLower(), out dpi) && item.Value != null)
|
||||||
if (dpi.Setter != null)
|
if (dpi.Setter != null)
|
||||||
@@ -142,18 +142,17 @@ namespace DynamORM.Mapper
|
|||||||
{
|
{
|
||||||
if (type.IsInterface)
|
if (type.IsInterface)
|
||||||
{
|
{
|
||||||
var members = new List<MemberInfo>();
|
List<MemberInfo> members = new List<MemberInfo>();
|
||||||
|
List<Type> considered = new List<Type>();
|
||||||
var considered = new List<Type>();
|
Queue<Type> queue = new Queue<Type>();
|
||||||
var queue = new Queue<Type>();
|
|
||||||
|
|
||||||
considered.Add(type);
|
considered.Add(type);
|
||||||
queue.Enqueue(type);
|
queue.Enqueue(type);
|
||||||
|
|
||||||
while (queue.Count > 0)
|
while (queue.Count > 0)
|
||||||
{
|
{
|
||||||
var subType = queue.Dequeue();
|
Type subType = queue.Dequeue();
|
||||||
foreach (var subInterface in subType.GetInterfaces())
|
foreach (Type subInterface in subType.GetInterfaces())
|
||||||
{
|
{
|
||||||
if (considered.Contains(subInterface)) continue;
|
if (considered.Contains(subInterface)) continue;
|
||||||
|
|
||||||
@@ -161,12 +160,12 @@ namespace DynamORM.Mapper
|
|||||||
queue.Enqueue(subInterface);
|
queue.Enqueue(subInterface);
|
||||||
}
|
}
|
||||||
|
|
||||||
var typeProperties = subType.GetMembers(
|
MemberInfo[] typeProperties = subType.GetMembers(
|
||||||
BindingFlags.FlattenHierarchy
|
BindingFlags.FlattenHierarchy
|
||||||
| BindingFlags.Public
|
| BindingFlags.Public
|
||||||
| BindingFlags.Instance);
|
| BindingFlags.Instance);
|
||||||
|
|
||||||
var newPropertyInfos = typeProperties
|
IEnumerable<MemberInfo> newPropertyInfos = typeProperties
|
||||||
.Where(x => !members.Contains(x));
|
.Where(x => !members.Contains(x));
|
||||||
|
|
||||||
members.InsertRange(0, newPropertyInfos);
|
members.InsertRange(0, newPropertyInfos);
|
||||||
|
|||||||
Reference in New Issue
Block a user