Skip to content

Commit 49bcf14

Browse files
committed
New optimizing model for ADO FindOne
1 parent 63b7980 commit 49bcf14

7 files changed

Lines changed: 76 additions & 6 deletions

File tree

Simple.Data.Ado/AdoAdapterFinder.cs

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

1010
namespace Simple.Data.Ado
1111
{
12+
using System.Data.SqlClient;
13+
using System.Dynamic;
14+
1215
class AdoAdapterFinder
1316
{
1417
private readonly ConcurrentDictionary<string, ConcurrentDictionary<string, CommandTemplate>> _commandCaches =
@@ -47,8 +50,34 @@ public Func<object[],IDictionary<string,object>> CreateFindOneDelegate(string ta
4750
{
4851
return _ => FindAll(_adapter.GetSchema().BuildObjectName(tableName)).FirstOrDefault();
4952
}
50-
var commandTemplate = GetCommandTemplate(tableName, criteria);
51-
return args => ExecuteSingletonQuery(commandTemplate, args);
53+
var commandBuilder = new FindHelper(_adapter.GetSchema())
54+
.GetFindByCommand(_adapter.GetSchema().BuildObjectName(tableName), criteria);
55+
56+
var command = commandBuilder.GetCommand(_adapter.CreateConnection());
57+
58+
var commandTemplate =
59+
commandBuilder.GetCommandTemplate(
60+
_adapter.GetSchema().FindTable(_adapter.GetSchema().BuildObjectName(tableName)));
61+
62+
var cloneable = command as ICloneable;
63+
if (cloneable != null)
64+
{
65+
return args => ExecuteSingletonQuery((IDbCommand)cloneable.Clone(), args, commandTemplate.Index);
66+
}
67+
else
68+
{
69+
return args => ExecuteSingletonQuery(commandTemplate, args);
70+
}
71+
}
72+
73+
private IDictionary<string, object> ExecuteSingletonQuery(IDbCommand command, object[] parameterValues, IDictionary<string,int> index)
74+
{
75+
for (int i = 0; i < command.Parameters.Count; i++)
76+
{
77+
((IDbDataParameter) command.Parameters[i]).Value = FixObjectType(parameterValues[i]);
78+
}
79+
command.Connection = _adapter.CreateConnection();
80+
return TryExecuteSingletonQuery(command.Connection, command, index);
5281
}
5382

5483
public IEnumerable<IDictionary<string, object>> Find(string tableName, SimpleExpression criteria)
@@ -149,5 +178,17 @@ private static IDictionary<string, object> TryExecuteSingletonQuery(IDbConnectio
149178
}
150179
return null;
151180
}
181+
182+
private static object FixObjectType(object value)
183+
{
184+
if (value == null) return DBNull.Value;
185+
if (TypeHelper.IsKnownType(value.GetType())) return value;
186+
var dynamicObject = value as DynamicObject;
187+
if (dynamicObject != null)
188+
{
189+
return dynamicObject.ToString();
190+
}
191+
return value;
192+
}
152193
}
153194
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
6+
namespace Simple.Data.Ado
7+
{
8+
using System.ComponentModel.Composition;
9+
10+
[Export(typeof(OptimizingDelegateFactory))]
11+
public class AdoOptimizingDelegateFactory : OptimizingDelegateFactory
12+
{
13+
public override Func<object[], IDictionary<string, object>> CreateFindOneDelegate(Adapter adapter, string tableName, SimpleExpression criteria)
14+
{
15+
return base.CreateFindOneDelegate(adapter, tableName, criteria);
16+
}
17+
}
18+
}

Simple.Data.Ado/Simple.Data.Ado.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
<Compile Include="OptimizedDictionary.cs" />
9595
<Compile Include="OptimizedDictionaryIndex.cs" />
9696
<Compile Include="OptimizedDictionary2.cs" />
97+
<Compile Include="AdoOptimizingDelegateFactory.cs" />
9798
<Compile Include="ParameterTemplate.cs" />
9899
<Compile Include="ProcedureExecutor.cs" />
99100
<Compile Include="Properties\AssemblyInfo.cs" />

Simple.Data.Mocking/Ado/MockDataParameterCollection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ public override IEnumerator GetEnumerator()
137137
/// <param name="index">The index of the <see cref="T:System.Data.Common.DbParameter"/> in the collection.</param>
138138
protected override DbParameter GetParameter(int index)
139139
{
140-
throw new NotImplementedException();
140+
return _collection[index];
141141
}
142142

143143
/// <summary>

Simple.Data.Mocking/Ado/MockDbCommand.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
namespace Simple.Data.Mocking.Ado
77
{
8-
class MockDbCommand : DbCommand
8+
class MockDbCommand : DbCommand, ICloneable
99
{
1010
private readonly MockDbConnection _connection;
1111

@@ -139,5 +139,15 @@ public override void Prepare()
139139
/// </returns>
140140
/// <filterpriority>2</filterpriority>
141141
public override int CommandTimeout { get; set; }
142+
143+
public object Clone()
144+
{
145+
var clone = new MockDbCommand(_connection) {CommandText = CommandText};
146+
foreach (var p in Parameters.Cast<IDbDataParameter>())
147+
{
148+
clone.Parameters.Add(new MockDataParameter {DbType = p.DbType, ParameterName = p.ParameterName});
149+
}
150+
return clone;
151+
}
142152
}
143153
}

Simple.Data/OptimizingDelegateFactoryBase.cs renamed to Simple.Data/OptimizingDelegateFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace Simple.Data
66
{
7-
public abstract class OptimizingDelegateFactoryBase
7+
public abstract class OptimizingDelegateFactory
88
{
99
public virtual Func<object[], IDictionary<string, object>> CreateFindOneDelegate(Adapter adapter, string tableName, SimpleExpression criteria)
1010
{

Simple.Data/Simple.Data.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
<Compile Include="DictionaryCloner.cs" />
8282
<Compile Include="FunctionSignature.cs" />
8383
<Compile Include="InMemoryAdapter.cs" />
84-
<Compile Include="OptimizingDelegateFactoryBase.cs" />
84+
<Compile Include="OptimizingDelegateFactory.cs" />
8585
<Compile Include="QueryPolyfills\AggregateValueResolver.cs" />
8686
<Compile Include="QueryPolyfills\DictionaryCreatorFactory.cs" />
8787
<Compile Include="QueryPolyfills\DictionaryEqualityComparer.cs" />

0 commit comments

Comments
 (0)