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

Commit 3663edc

Browse files
committed
Add support for Dynamic Results in custom selects
1 parent 5b7d6c4 commit 3663edc

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

src/ServiceStack.OrmLite/Expressions/SqlExpression.Join.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,14 +163,20 @@ public string SelectInto<TModel>()
163163
}
164164

165165
var sbSelect = StringBuilderCache.Allocate();
166-
167-
var selectDef = typeof(TModel).GetModelDefinition();
166+
var selectDef = modelDef;
168167
var orderedDefs = tableDefs;
169-
if (selectDef != modelDef && tableDefs.Contains(selectDef))
168+
169+
if (typeof(TModel) != typeof(List<object>) &&
170+
typeof(TModel) != typeof(Dictionary<string, object>) &&
171+
typeof(TModel) != typeof(object)) //dynamic
170172
{
171-
orderedDefs = tableDefs.ToList(); //clone
172-
orderedDefs.Remove(selectDef);
173-
orderedDefs.Insert(0, selectDef);
173+
selectDef = typeof(TModel).GetModelDefinition();
174+
if (selectDef != modelDef && tableDefs.Contains(selectDef))
175+
{
176+
orderedDefs = tableDefs.ToList(); //clone
177+
orderedDefs.Remove(selectDef);
178+
orderedDefs.Insert(0, selectDef);
179+
}
174180
}
175181

176182
foreach (var fieldDef in selectDef.FieldDefinitions)

tests/ServiceStack.OrmLite.Tests/AutoQueryTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,38 @@ public void Does_query_Rockstars_Single_with_anon_SelectInto()
194194
}
195195
}
196196

197+
[Test]
198+
public void Can_use_dynamic_apis_on_Custom_Select()
199+
{
200+
using (var db = OpenDbConnection())
201+
{
202+
db.DropTable<DeptEmployee>();
203+
db.DropTable<Department2>();
204+
db.CreateTable<Department2>();
205+
db.CreateTable<DeptEmployee>();
206+
207+
db.InsertAll(SeedDepartments);
208+
db.InsertAll(SeedEmployees);
209+
210+
var q = db.From<DeptEmployee>().Select(new[] {"FirstName"}).Take(2);
211+
212+
var resultsMap = db.Select<Dictionary<string, object>>(q);
213+
Assert.That(resultsMap.Count, Is.EqualTo(2));
214+
Assert.That(resultsMap[0].ContainsKey("FirstName"));
215+
Assert.That(!resultsMap[0].ContainsKey("Id"));
216+
217+
var resultsList = db.Select<List<object>>(q);
218+
Assert.That(resultsList.Count, Is.EqualTo(2));
219+
Assert.That(resultsList[0].Count, Is.EqualTo(1));
220+
221+
var resultsDynamic = db.Select<dynamic>(q);
222+
Assert.That(resultsDynamic.Count, Is.EqualTo(2));
223+
var map = (IDictionary<string, object>) resultsDynamic[0];
224+
Assert.That(map.ContainsKey("FirstName"));
225+
Assert.That(!map.ContainsKey("Id"));
226+
}
227+
}
228+
197229
[Test]
198230
public void Does_only_populate_Select_fields()
199231
{

0 commit comments

Comments
 (0)