我正在尝试使用新的.WithSqlFilter()
扩展方法将“WITH(NOEXPAND)”提示添加到针对我的索引视图生成的select语句中。但是,输出SQL将提示放在WHERE子句而不是FROM子句之后。我的客户DTO也有[Alias("CustomerInfo")]
。这是预期的行为还是错误地生成SQL?
var customer = db.From<Customer>()
.Where(ci => ci.CustomerId == customerCode)
.WithSqlFilter(sql => IsSqlServer(db) ? sql + " WITH (NOEXPAND)" : sql);
return db.Single(customer);
编辑:我需要IsSqlServer方法,因为我还有单元测试和其他使用Sqlite而不是SQL Server的代码,并且需要能够忽略基于连接的提示。
private bool IsSqlServer(IDbConnection db)
{
var dialect = db.GetDialectProvider();
return dialect is ServiceStack.OrmLite.SqlServer.SqlServerOrmLiteDialectProvider ||
dialect is ServiceStack.OrmLite.SqlServer.SqlServer2012OrmLiteDialectProvider ||
dialect is ServiceStack.OrmLite.SqlServer.SqlServer2014OrmLiteDialectProvider ||
dialect is ServiceStack.OrmLite.SqlServer.SqlServer2016OrmLiteDialectProvider;
}
生成的SQL:
SELECT TOP 1 "CustomerId", "FirstName", "MiddleInitial", "LastName", "Address", "City", "State", "ZipCode", "DateOfBirth", "HomePhoneNumber", "CellPhoneNumber", "EmailAddress", "EnrollmentDate", "IsEmployee", "ModifyDate", "LastModifiedByEmployee"
FROM "CustomerInfo"
WHERE ("CustomerId" = @0) WITH (NOEXPAND)
PARAMS: @0=123456
答案 0 :(得分:1)
使用完整的SQL语句调用WithSqlFilter
,这样如果你重新连接&#34; WITH(NOEXPAND)&#34;在SQL字符串末尾的附加位置。
要扩展FROM子句,您可以将其替换为:
.WithSqlFilter(sql => IsSqlServer(db)
? sql.Replace("FROM \"CustomerInfo\"", "FROM \"CustomerInfo\" WITH (NOEXPAND)")
: sql);
或者你可以扩展FromExpression
,例如:
var q = db.From<Customer>()
.Where(ci => ci.CustomerId == customerCode);
q.FromExpression += " WITH (NOEXPAND)";