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)";