【发布时间】:2014-12-18 02:05:47
【问题描述】:
我正在从 ServiceStack 研究 ORMLite,我在这里尝试做的是调用一个存储过程,该过程又返回许多行,这些行肯定不会绑定到任何域对象,但也可能有也可能没有 dto映射的对象。我想知道我是否可以将它绑定到一个类型。但是,听起来 ORMLite 目前不支持动态类型绑定。 ORMLite 目前支持吗?
【问题讨论】:
标签: c# orm servicestack ormlite-servicestack
我正在从 ServiceStack 研究 ORMLite,我在这里尝试做的是调用一个存储过程,该过程又返回许多行,这些行肯定不会绑定到任何域对象,但也可能有也可能没有 dto映射的对象。我想知道我是否可以将它绑定到一个类型。但是,听起来 ORMLite 目前不支持动态类型绑定。 ORMLite 目前支持吗?
【问题讨论】:
标签: c# orm servicestack ormlite-servicestack
根据设计,OrmLite 不支持编组为动态类型,并希望将结果集映射到 Typed POCO。
虽然它确实有专门的 API 来使用 C# 7 元组访问 Dynamic Result Sets:
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();
或List<object>:
db.Select<List<object>>(db.From<Poco>()
.Select("COUNT(*), MIN(Id), MAX(Id)"))[0].PrintDump();
/* Output */
[
10,
1,
10
]
或使用Dictionary<string,object>,例如:
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
}
除了能够映射到松散类型的 .NET 集合之外:
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")
OrmLite 确实有 Dapper 的嵌入式版本 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);
}
【讨论】: