当sql没有以SELECT开头时如何选择POCO?

时间:2014-01-03 21:56:15

标签: ormlite-servicestack

我正在尝试使用类似于此的查询在单个语句中运行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解析结果?

2 个答案:

答案 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>();

            }));