我正在尝试使用类似于此的查询在单个语句中运行update / select:
UPDATE TOP(1) myTable SET blah = 'meh' OUTPUT INSERTED.*
查询本身没有问题,但是我很难弄清楚如何使用OrmLite来运行它。
我尝试过这些方法:
QuerySingle,Select,Query - 这些正在检查查询字符串,如果查询没有以“select”开头,它们会将sql作为where子句传递,所以在我的情况下查询进入服务器实际上已经坏了(类似'选择等待更新.... ')
GetList(sql).SingleOrDefault() - throws'无法将类型为'System.Int32'的对象强制转换为MyType'。不太清楚这里有什么问题。
有没有办法运行原始sql并让OrmLite解析结果?
答案 0 :(得分:1)
使用SqlReader解决了这个问题。
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(sql, connection))
{
var reader = command.ExecuteReader();
var obj = reader.ConvertTo<MyObject>();
}
}
基本上。 ServiceStack有一个从sqlreader到具体类型的便捷转换器。
答案 1 :(得分:0)
我喜欢这个(不需要创建SqlCommand,只需使用IDbConnection _db)
ProjectTotals lastAmendments = _db.Exec<ProjectTotals>(new Func<IDbCommand, ProjectTotals>(delegate(IDbCommand com)
{
com.CommandText = @";WITH cte AS
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY BaseInvoiceId ORDER BY Id DESC) AS rn
FROM PzuInvoice WHERE BaseInvoiceId is not null AND ProjectId = {0}
)
SELECT sum(TotalValue),sum(MarginPlan) [Margin], count(*) [Count]
FROM cte
WHERE rn = 1".Fmt(_invoice.ProjectId);
var reader = com.ExecuteReader();
return reader.ConvertTo<ProjectTotals>();
}));