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

Commit 005cc61

Browse files
committed
Add support for unstructured List and DIctionary objects in Single<T> and Scalar<T> API's
1 parent 75e5354 commit 005cc61

File tree

3 files changed

+57
-15
lines changed

3 files changed

+57
-15
lines changed

src/ServiceStack.OrmLite/OrmLiteReadCommandExtensions.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,9 @@ internal static T Scalar<T>(this IDataReader reader, IOrmLiteDialectProvider dia
659659
while (reader.Read())
660660
{
661661
object oValue = reader.GetValue(0);
662-
return ToScalar<T>(dialectProvider, oValue);
662+
return typeof(T) == typeof (object)
663+
? (T)oValue
664+
: ToScalar<T>(dialectProvider, oValue);
663665
}
664666

665667
return default(T);

src/ServiceStack.OrmLite/OrmLiteUtils.cs

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ public static T ConvertTo<T>(this IDataReader dataReader, IOrmLiteDialectProvide
4141
{
4242
if (dataReader.Read())
4343
{
44+
if (typeof(T) == typeof (List<object>))
45+
return (T)(object)dataReader.ConvertToListObjects();
46+
47+
if (typeof(T) == typeof(Dictionary<string, object>))
48+
return (T)(object)dataReader.ConvertToDictionaryObjects();
49+
4450
var row = CreateInstance<T>();
4551
var indexCache = dataReader.GetIndexFieldsCache(ModelDefinition<T>.Definition);
4652
row.PopulateWithSqlReader(dialectProvider, dataReader, fieldDefs, indexCache);
@@ -50,6 +56,26 @@ public static T ConvertTo<T>(this IDataReader dataReader, IOrmLiteDialectProvide
5056
}
5157
}
5258

59+
public static List<object> ConvertToListObjects(this IDataReader dataReader)
60+
{
61+
var row = new List<object>();
62+
for (var i = 0; i < dataReader.FieldCount; i++)
63+
{
64+
row.Add(dataReader.GetValue(i));
65+
}
66+
return row;
67+
}
68+
69+
public static Dictionary<string, object> ConvertToDictionaryObjects(this IDataReader dataReader)
70+
{
71+
var row = new Dictionary<string, object>();
72+
for (var i = 0; i < dataReader.FieldCount; i++)
73+
{
74+
row[dataReader.GetName(i).Trim()] = dataReader.GetValue(i);
75+
}
76+
return row;
77+
}
78+
5379
public static List<T> ConvertToList<T>(this IDataReader dataReader, IOrmLiteDialectProvider dialectProvider)
5480
{
5581
var fieldDefs = ModelDefinition<T>.Definition.AllFieldDefinitionsArray;
@@ -59,32 +85,24 @@ public static List<T> ConvertToList<T>(this IDataReader dataReader, IOrmLiteDial
5985
var to = new List<List<object>>();
6086
using (dataReader)
6187
{
62-
var row = new List<object>();
6388
while (dataReader.Read())
6489
{
65-
for (var i = 0; i < dataReader.FieldCount; i++)
66-
{
67-
row.Add(dataReader.GetValue(i));
68-
}
90+
var row = dataReader.ConvertToListObjects();
91+
to.Add(row);
6992
}
70-
to.Add(row);
7193
}
7294
return (List<T>)(object)to;
7395
}
74-
else if (typeof(T) == typeof(Dictionary<string, object>))
96+
if (typeof(T) == typeof(Dictionary<string, object>))
7597
{
7698
var to = new List<Dictionary<string,object>>();
7799
using (dataReader)
78100
{
79-
var row = new Dictionary<string,object>();
80101
while (dataReader.Read())
81102
{
82-
for (var i = 0; i < dataReader.FieldCount; i++)
83-
{
84-
row[dataReader.GetName(i).Trim()] = dataReader.GetValue(i);
85-
}
103+
var row = dataReader.ConvertToDictionaryObjects();
104+
to.Add(row);
86105
}
87-
to.Add(row);
88106
}
89107
return (List<T>)(object)to;
90108
}

tests/ServiceStack.OrmLite.Tests/Expression/SqlExpressionTests.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,10 @@ public void Can_Select_as_List_Object()
124124
Assert.That(Convert.ToInt64(result[2]), Is.EqualTo(letterFrequencyMinId));
125125
Assert.That(Convert.ToInt64(result[3]), Is.EqualTo(letterFrequencySumId));
126126

127-
results.PrintDump();
127+
var single = db.Single<List<object>>(query);
128+
Assert.That(single, Is.EquivalentTo(result));
129+
130+
result.PrintDump();
128131
}
129132
}
130133

@@ -151,10 +154,29 @@ public void Can_Select_as_Dictionary_Object()
151154
Assert.That(Convert.ToInt64(result["Min"]), Is.EqualTo(letterFrequencyMinId));
152155
Assert.That(Convert.ToInt64(result["Sum"]), Is.EqualTo(letterFrequencySumId));
153156

157+
var single = db.Single<Dictionary<string, object>>(query);
158+
Assert.That(single, Is.EquivalentTo(result));
159+
154160
results.PrintDump();
155161
}
156162
}
157163

164+
[Test]
165+
public void Can_select_Object()
166+
{
167+
using (var db = OpenDbConnection())
168+
{
169+
db.DropAndCreateTable<LetterFrequency>();
170+
db.Insert(new LetterFrequency { Id = 1, Letter = "A" });
171+
172+
var result = db.Scalar<object>(db.From<LetterFrequency>().Select(x => x.Letter));
173+
Assert.That(result, Is.EqualTo("A"));
174+
175+
result = db.Scalar<object>(db.From<LetterFrequency>().Select(x => x.Id));
176+
Assert.That(result, Is.EqualTo(1));
177+
}
178+
}
179+
158180
[Test]
159181
public void Can_select_limit_with_SqlExpression()
160182
{

0 commit comments

Comments
 (0)