如何修改ServiceStack.OrmLite生成的SQL?

时间:2013-06-04 11:08:46

标签: servicestack ormlite-servicestack amazon-redshift

我想在C#中使用ServiceStack's OrmLite来查询AWS RedShift。 AWS RedShift使用postgresql有线协议作为其查询接口,并对可以运行的查询设置一些约束,其中一个是它不能接受参数化查询(我被告知;我实际上无法找到这个backed up in documentation yet)。

所以,我正在调查是否可以使用ORM生成参数化SQL,然后在参数值中查找/替换。

如何访问OrmLite生成的SQL,然后在运行之前更改它?

2 个答案:

答案 0 :(得分:1)

来自OrmLite's documentation

默认情况下,OrmLite 使用参数化SQL。只有为所有SQL操作使用参数化语句的API才会使用Param后缀标识,例如:

参数化写入操作

db.InsertParam(new Person { FirstName = "Jimi", LastName = "Hendrix", Age = 27})
db.UpdateParam(new Person { FirstName = "Jimi", LastName = "Hendrix", Age = 27})
db.DeleteByIdParam<Person>(1)
Parameterized Read operations

var people = db.SelectParam<Person>(q => q.Age == 27)
var person = db.GetByIdParam<Person>(1)

//Existing parameterized query API's
var people = db.Where<Person>(new { FirstName = "Jimi", Age = 27 })
var people = db.Query<Track>("FirstName = @name and Age = @age", 
    new { name = "Jimi", age = 27 })

此外,包含查询其中一词的选择方法也使用参数化SQL(其他选择方法)。传递到Where的匿名类型被视为AND过滤器。

var track3 = db.Where<Track>(new { AlbumName = "Throwing Copper", TrackNo = 3 })

查询语句使用提供的匿名类型(如果有)

中的属性来获取参数化SQL
var track3 = db.Query<Track>(
"select * from Track Where AlbumName = @album and TrackNo = @trackNo", 
    new { album = "Throwing Copper", trackNo = 3 })

执行之后(之前),您可以使用以下命令生成Last SQL语句:

db.GetLastSql()

答案 1 :(得分:1)

OrmLite在执行之前不会(当前)生成可用的SQL。

我发现RedShift确实支持参数化查询。