WithSqlFilter WITH (NOEXPAND) 提示在输出中不正确 SQL
WithSqlFilter WITH (NOEXPAND) hint not correct in output SQL
我正在尝试使用新的 .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
WithSqlFilter
使用完整的 SQL 语句调用,因此如果您在 SQL 字符串的末尾连接“WITH (NOEXPAND)”,它会附加到.
要扩展 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)";
我正在尝试使用新的 .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
WithSqlFilter
使用完整的 SQL 语句调用,因此如果您在 SQL 字符串的末尾连接“WITH (NOEXPAND)”,它会附加到.
要扩展 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)";