I am looking into ORMLite from ServiceStack and what I am trying to do here is that call a stored procedure which in turn return many many rows which definitely would not be bound to any domain object but also may or may not have a dto object to map with. I was wondering if I can bind it to a type. However, it sounds like ORMLite does not support dynamic type binding at this time. Does ORMLite support at this point?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
By design OrmLite does not support marshalling to dynamic types, and expects resultsets to mapped to Typed POCO's.
Although it does have specialized API's to access Dynamic Result Sets using C# 7 Tuples:
var query = db.From<Employee>()
.Join<Department>()
.OrderBy(e => e.Id)
.Select<Employee, Department>(
(e, d) => new { e.Id, e.LastName, d.Name });
var results = db.Select<(int id, string lastName, string deptName)>(query);
var row = results[i];
$"row: ${row.id}, ${row.lastName}, ${row.deptName}".Print();
Or List<object>
:
db.Select<List<object>>(db.From<Poco>()
.Select("COUNT(*), MIN(Id), MAX(Id)"))[0].PrintDump();
/* Output */
[
10,
1,
10
]
Or using Dictionary<string,object>
, e.g:
db.Select<Dictionary<string,object>>(db.From<Poco>()
.Select("COUNT(*) Total, MIN(Id) MinId, MAX(Id) MaxId"))[0].PrintDump();
/* Output */
{
Total: 10,
MinId: 1,
MaxId: 10
}
As well as being able to map into loose-typed .NET collections:
Dictionary<int, string> trackIdNamesMap = db.Dictionary<int, string>(
"select Id, Name from Track")
Dictionary<int, List<string>> albumTrackNames = db.Lookup<int, string>(
"select AlbumId, Name from Track")
List<string> trackNames = db.Column<string>("select Name from Track")
HashSet<string> uniqueTrackNames = db.ColumnDistinct<string>("select Name from Track")
Using Dapper's Query
OrmLite does have an embedded version of Dapper which does support dynamic results:
using ServiceStack.OrmLite.Dapper;
using (var db = new SqlConnection(@"Data Source=... etc."))
{
db.Open();
var p = new DynamicParameters();
p.Add("@params", "Id=21");
IEnumerable<dynamic> dynamicResults = db.Query(sql:"GetPivotData", param: p,
commandType:CommandType.StoredProcedure);
}