ServiceStack.OrmLite是我目前用过的最顺手的ORM,Dapper高性能但是在模型映射方面不够灵活;EF封装严密,自动化程度高,但是缺少足够控制。
ServiceStack.OrmLite做到了平衡,简单、好用!
存储过程操作
使用自定义的原始 SQL API 执行存储过程
一个完善的ORM框架除了需要提供方便的对象关系映射操作,还应该提供执行原生SQL的API。
类库API:SqlList
使用自定义的原始SQL API提供非常方便的方式来映射查询结果。
示例:
List<Poco> results = db.SqlList<Poco>("EXEC GetAnalyticsForWeek 1");
List<Poco> results = db.SqlList<Poco>(
"EXEC GetAnalyticsForWeek @weekNo", new { weekNo = 1 });
List<int> results = db.SqlList<int>("EXEC GetTotalsForWeek 1");
List<int> results = db.SqlList<int>(
"EXEC GetTotalsForWeek @weekNo", new { weekNo = 1 });
int result = db.SqlScalar<int>("SELECT 10");
调用存储过程(带Output参数的)
类库API:SqlProc
提供更多自定义的控制,用来控制Ado.Net调用存储过程,返回IDbCommand
允许定制参数和索引,示例:
string spSql = @"DROP PROCEDURE IF EXISTS spSearchLetters;
CREATE PROCEDURE spSearchLetters (IN pLetter varchar(10), OUT pTotal int)
BEGIN
SELECT COUNT(*) FROM LetterFrequency WHERE Letter = pLetter INTO pTotal;
SELECT * FROM LetterFrequency WHERE Letter = pLetter;
END";
db.ExecuteSql(spSql);
using (var cmd = db.SqlProc("spSearchLetters", new { pLetter = "C" }))
{
var pTotal = cmd.AddParam("pTotal", direction: ParameterDirection.Output);
var results = cmd.ConvertToList<LetterFrequency>();
var total = pTotal.Value;
}
另一种方式是使用SqlList
,它可以让你使用一个过滤器来定制一个存储过程或任何其他命令类型,如:
IDbDataParameter pTotal = null;
var results = db.SqlList<LetterFrequency>("spSearchLetters", cmd => {
cmd.CommandType = CommandType.StoredProcedure;
cmd.AddParam("pLetter", "C");
pTotal = cmd.AddParam("pTotal", direction: ParameterDirection.Output);
});
var total = pTotal.Value;
更多使用示例,可以参考SqlServerProviderTests