Skip to content

Commit f329eff

Browse files
committed
add support nest object access
1 parent b85c3d6 commit f329eff

File tree

4 files changed

+62
-4
lines changed

4 files changed

+62
-4
lines changed

src/SmartSql.Test.Unit/DbSessions/SqlMapperTest.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,17 @@ public void QueryEnableTrack()
5757
state = entityProxy.GetPropertyVersion(nameof(AllPrimitive.String));
5858
Assert.Equal(1, state);
5959
}
60+
61+
[Fact]
62+
public void QueryNest()
63+
{
64+
var result = SqlMapper.ExecuteScalar<int>(new RequestContext
65+
{
66+
RealSql = "SELECT @User.Id",
67+
Request = new {User = new {Id = 0}}
68+
});
69+
70+
Assert.Equal(0,result);
71+
}
6072
}
6173
}

src/SmartSql/Data/SqlParameterCollection.cs

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,46 @@ public bool TryGetValue(string key, out SqlParameter value)
161161
return true;
162162
}
163163

164-
return false;
164+
return TryCreateParameter(key, out value);
165+
}
166+
167+
private bool TryCreateParameter(string key, out SqlParameter value)
168+
{
169+
value = default;
170+
PropertyTokenizer propertyTokenizer = new PropertyTokenizer(key);
171+
if (propertyTokenizer.FullName == propertyTokenizer.Name)
172+
{
173+
return false;
174+
}
165175

176+
if (!_sqlParameters.TryGetValue(propertyTokenizer.Name, out var root))
177+
{
178+
return false;
179+
}
180+
181+
if (!propertyTokenizer.MoveNext())
182+
{
183+
return false;
184+
}
185+
186+
if (!_getAccessorFactory.TryCreate(root.ParameterType, propertyTokenizer.Current, out var getMethodImpl))
187+
{
188+
return false;
189+
}
190+
191+
var paramVal = getMethodImpl(root.Value);
192+
value = new SqlParameter(key, paramVal, paramVal == null ? CommonType.Object : paramVal.GetType());
193+
Add(value);
194+
return true;
166195
}
167196

197+
/// <summary>
198+
/// TODO Parameter name convert, ContainsKey [.]
199+
/// </summary>
200+
/// <param name="propertyName"></param>
201+
/// <param name="paramVal"></param>
202+
/// <typeparam name="T"></typeparam>
203+
/// <returns></returns>
168204
public bool TryGetParameterValue<T>(string propertyName, out T paramVal)
169205
{
170206
if (TryGetValue(propertyName, out var sqlParameter))
@@ -185,8 +221,15 @@ public bool TryGetParameterValue<T>(string propertyName, out T paramVal)
185221

186222
#region Contains
187223

188-
public bool ContainsKey(string key) => _sqlParameters.ContainsKey(key);
189-
public bool Contains(KeyValuePair<string, SqlParameter> item) => _sqlParameters.Contains(item);
224+
public bool ContainsKey(string key)
225+
{
226+
return _sqlParameters.ContainsKey(key);
227+
}
228+
229+
public bool Contains(KeyValuePair<string, SqlParameter> item)
230+
{
231+
throw new NotImplementedException();
232+
}
190233

191234
#endregion
192235

src/SmartSql/Middlewares/PrepareStatementMiddleware.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313

1414
namespace SmartSql.Middlewares
1515
{
16+
/// <summary>
17+
/// TODO nest object access
18+
/// </summary>
1619
public class PrepareStatementMiddleware : AbstractMiddleware
1720
{
1821
private ILogger _logger;

src/SmartSql/Reflection/PropertyAccessor/EmitGetAccessorFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public bool TryCreate(Type targetType, PropertyTokenizer propertyTokenizer,
2828
TryCreateImpl(targetType, propertyTokenizer, out var getMethod);
2929
return getMethod;
3030
});
31-
return getMethodImpl == null;
31+
return getMethodImpl != null;
3232
}
3333

3434
private bool TryCreateImpl(Type targetType, PropertyTokenizer propertyTokenizer,

0 commit comments

Comments
 (0)