Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 4b6edbe

Browse files
committed
Add support for dynamic result sets in singleAsync
1 parent 6ccc018 commit 4b6edbe

File tree

5 files changed

+78
-10
lines changed

5 files changed

+78
-10
lines changed

src/ServiceStack.OrmLite/Async/OrmLiteUtilExtensionsAsync.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,19 @@ public static T CreateInstance<T>()
2323
public static Task<T> ConvertToAsync<T>(this IDataReader reader, IOrmLiteDialectProvider dialectProvider, CancellationToken token)
2424
{
2525
var indexCache = reader.GetIndexFieldsCache(ModelDefinition<T>.Definition, dialectProvider);
26-
var values = new object[reader.FieldCount];
2726
return dialectProvider.ReaderRead(reader, () =>
2827
{
28+
if (typeof(T) == typeof(List<object>))
29+
return (T)(object)reader.ConvertToListObjects();
30+
31+
if (typeof(T) == typeof(Dictionary<string, object>))
32+
return (T)(object)reader.ConvertToDictionaryObjects();
33+
34+
var values = new object[reader.FieldCount];
35+
36+
if (typeof(T).Name.StartsWith("ValueTuple`"))
37+
return reader.ConvertToValueTuple<T>(values, dialectProvider);
38+
2939
var row = CreateInstance<T>();
3040
row.PopulateWithSqlReader(dialectProvider, reader, indexCache, values);
3141
return row;

src/ServiceStack.OrmLite/OrmLiteUtils.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ public static T CreateInstance<T>()
8383

8484
public static bool IsScalar<T>()
8585
{
86-
return typeof(T).IsValueType() && !typeof(T).Name.StartsWith("ValueTuple`", StringComparison.Ordinal) || typeof(T) == typeof(string);
86+
var isScalar = typeof(T).IsValueType() && !typeof(T).Name.StartsWith("ValueTuple`", StringComparison.Ordinal) || typeof(T) == typeof(string);
87+
return isScalar;
8788
}
8889

8990
public static T ConvertTo<T>(this IDataReader reader, IOrmLiteDialectProvider dialectProvider, HashSet<string> onlyFields=null)

src/ServiceStack.OrmLite/TemplateDbFilters.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ T exec<T>(Func<IDbConnection, T> fn, TemplateScopeContext scope, object options)
3131
}
3232

3333
public object dbSelect(TemplateScopeContext scope, string sql) =>
34-
exec(db => db.Select<Dictionary<string, object>>(sql), scope, null);
34+
exec(db => db.SqlList<Dictionary<string, object>>(sql), scope, null);
3535

3636
public object dbSelect(TemplateScopeContext scope, string sql, Dictionary<string, object> args) =>
37-
exec(db => db.Select<Dictionary<string, object>>(sql, args), scope, null);
37+
exec(db => db.SqlList<Dictionary<string, object>>(sql, args), scope, null);
3838

3939
public object dbSelect(TemplateScopeContext scope, string sql, Dictionary<string, object> args, object options) =>
40-
exec(db => db.Select<Dictionary<string, object>>(sql, args), scope, options);
40+
exec(db => db.SqlList<Dictionary<string, object>>(sql, args), scope, options);
4141

4242

4343
public object dbSingle(TemplateScopeContext scope, string sql) =>

src/ServiceStack.OrmLite/TemplateDbFiltersAsync.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ public IDbConnectionFactory DbFactory
1616
set => dbFactory = value;
1717
}
1818

19-
Task<object> exec<T>(Func<IDbConnection, Task<T>> fn, TemplateScopeContext scope, object options)
19+
async Task<object> exec<T>(Func<IDbConnection, Task<T>> fn, TemplateScopeContext scope, object options)
2020
{
2121
try
2222
{
2323
using (var db = DbFactory.Open())
2424
{
25-
return fn(db).Then(x => (object)x);
25+
var result = await fn(db);
26+
return result;
2627
}
2728
}
2829
catch (Exception ex)
@@ -32,13 +33,13 @@ Task<object> exec<T>(Func<IDbConnection, Task<T>> fn, TemplateScopeContext scope
3233
}
3334

3435
public Task<object> dbSelect(TemplateScopeContext scope, string sql) =>
35-
exec(db => db.SelectAsync<Dictionary<string, object>>(sql), scope, null);
36+
exec(db => db.SqlListAsync<Dictionary<string, object>>(sql), scope, null);
3637

3738
public Task<object> dbSelect(TemplateScopeContext scope, string sql, Dictionary<string, object> args) =>
38-
exec(db => db.SelectAsync<Dictionary<string, object>>(sql, args), scope, null);
39+
exec(db => db.SqlListAsync<Dictionary<string, object>>(sql, args), scope, null);
3940

4041
public Task<object> dbSelect(TemplateScopeContext scope, string sql, Dictionary<string, object> args, object options) =>
41-
exec(db => db.SelectAsync<Dictionary<string, object>>(sql, args), scope, options);
42+
exec(db => db.SqlListAsync<Dictionary<string, object>>(sql, args), scope, options);
4243

4344

4445
public Task<object> dbSingle(TemplateScopeContext scope, string sql) =>
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using System.Collections.Generic;
2+
using System.Threading.Tasks;
3+
using NUnit.Framework;
4+
using ServiceStack.Templates;
5+
6+
namespace ServiceStack.OrmLite.Tests
7+
{
8+
public class TemplateDbTests : OrmLiteTestBase
9+
{
10+
public TemplateDbTests() : base(Dialect.SqlServer) {}
11+
12+
[Test]
13+
public async Task Can_retrieve_single_record_with_param()
14+
{
15+
using (var db = OpenDbConnection())
16+
{
17+
db.DropAndCreateTable<Rockstar>();
18+
db.InsertAll(AutoQueryTests.SeedRockstars);
19+
20+
var args = new Dictionary<string, object> {{"id", 3}};
21+
var result = db.Single<Rockstar>("SELECT * FROM Rockstar WHERE Id = @id", args);
22+
Assert.That(result.FirstName, Is.EqualTo("Kurt"));
23+
24+
result = await db.SingleAsync<Rockstar>("SELECT * FROM Rockstar WHERE Id = @id", args);
25+
Assert.That(result.FirstName, Is.EqualTo("Kurt"));
26+
27+
result = await db.SingleAsync<Rockstar>("SELECT * FROM Rockstar WHERE Id = @id", new { id = 3 });
28+
Assert.That(result.FirstName, Is.EqualTo("Kurt"));
29+
}
30+
}
31+
32+
[Test]
33+
public async Task Can_call_dbSingle_with_param()
34+
{
35+
using (var db = OpenDbConnection())
36+
{
37+
db.DropAndCreateTable<Rockstar>();
38+
db.InsertAll(AutoQueryTests.SeedRockstars);
39+
40+
var args = new Dictionary<string, object> { { "id", 3 } };
41+
42+
var filter = new TemplateDbFilters { DbFactory = base.DbFactory };
43+
var result = filter.dbSingle(default(TemplateScopeContext), "SELECT * FROM Rockstar WHERE Id = @id", args);
44+
var objDictionary = (Dictionary<string, object>)result;
45+
Assert.That(objDictionary["FirstName"], Is.EqualTo("Kurt"));
46+
47+
var asyncFilter = new TemplateDbFiltersAsync { DbFactory = base.DbFactory };
48+
result = await asyncFilter.dbSingle(default(TemplateScopeContext), "SELECT * FROM Rockstar WHERE Id = @id", args);
49+
50+
objDictionary = (Dictionary<string, object>)result;
51+
Assert.That(objDictionary["FirstName"], Is.EqualTo("Kurt"));
52+
}
53+
}
54+
55+
}
56+
}

0 commit comments

Comments
 (0)