SqlExpression创建上层SQL查询

时间:2018-11-23 07:29:32

标签: c# ormlite-servicestack

我有以下代码:

SqlExpression<Postcodes> sqlExpression = db.From<Postcodes>()
                    .Where(x => x.CityId.StartsWith(searchString))
                    .OrderBy(x => x.CityId)
                    .ThenBy(x => x.ZipCode)
                    .Take(take);

在调试时,我看到sqlExpression.BodyExpression具有:

FROM "search"."Postcodes"
WHERE upper("CityId") like @0

即使我没有使用x.CityId.ToUpper(),为什么它会生成“ upper”?

更新: 当我使用"nort"作为输入时,我可以在调试输出中看到这一点:

2018-11-23 07:37:22,781 [21] DEBUG ServiceStack.OrmLite.OrmLiteReadCommandExtensions [(null)] - SQL: SELECT TOP 100 "ZipCode", "CityId", "StateId" 
FROM "search"."Postcodes"
WHERE upper("CityId") like @0
ORDER BY "CityId", "ZipCode"
PARAMS: @0=NORT%

默认情况下,它看起来像不区分大小写的匹配。

为什么默认的大小写不区分大小写,我怎么能强迫它进行区分大小写的匹配?

更新: 正如Gabitu指出的那样,它只是使列名大写而不会影响查询。使列名大写有什么意义?

1 个答案:

答案 0 :(得分:1)

我认为它正在对您的列名进行上标,因此完全不会影响您的查询。

查询将类似于以下内容:

SELECT * 
FROM "search"."Postcodes" 
WHERE CITYID like @0
ORDER BY "CityId"

由于您的列不区分大小写,可能是将其变为大写。使用以下命令检查您的列是否敏感:

SELECT COLUMN_NAME, COLLATION_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE 
   TABLE_NAME = 'Postcodes' AND 
   CHARACTER_SET_NAME IS NOT NULL AND 
   TABLE_SCHEMA = 'search'