WithSqlFilter WITH(NOEXPAND)提示在输出SQL中不正确

时间:2017-03-28 12:42:30

标签: c# sql-server servicestack ormlite-servicestack

我正在尝试使用新的.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 

1 个答案:

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