c# - limitations - NHibernate HQL Generator to support SQL Server 2016 temporal tables

temporal tables vs cdc (1)

    @String2 NVARCHAR(100) ,
    @DateTime DATETIME= '2018-01-16 00:00:00';

 SET @String1 = 'SELECT * FROM Table2';
 SET @String2 = @String1 + ' FOR SYSTEM_TIME AS OF '''
 + CONVERT(VARCHAR(20), @DateTime, 120) + '''';
 SELECT  @String2;

I am trying to implement basic support for SQL Server 2016 temporal tables in NHibernate 4.x. The idea is to alter SQL statement from

SELECT * FROM Table t0


SELECT * FROM Table FOR SYSTEM_TIME AS OF '2018-01-16 00:00:00' t0

You can find more info about temporal tables in SQL Server 2016 here

Unfortunately, I've not found any way to insert FOR FOR SYSTEM_TIME AS OF '...' statement between table name and its alias. I'm not sure if custom dialects supports this. The only working solution I have for now is to append FOR SYSTEM_TIME statement within extra WHERE and my output SQL looks like this

SELECT * FROM Table t0 WHERE FOR SYSTEM_TIME AS OF '2018-01-16 00:00:00'=1

To do so, I have implemented generator and dialect as follows:

public static class AuditableExtensions
    public static bool AsOf(this IAuditable entity, DateTime date)
        return true;

    public static IQueryable<T> Query<T>(this ISession session, DateTime asOf) where T : IAuditable
        return session.Query<T>().Where(x => x.AsOf(asOf));

public class ForSystemTimeGenerator : BaseHqlGeneratorForMethod
    public static readonly string ForSystemTimeAsOfString = "FOR SYSTEM_TIME AS OF";

    public ForSystemTimeGenerator()
        SupportedMethods = new[]
            ReflectionHelper.GetMethod(() => AuditableExtensions.AsOf(null, DateTime.MinValue))

    public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, 
        ReadOnlyCollection<Expression> arguments,
        HqlTreeBuilder treeBuilder, 
        IHqlExpressionVisitor visitor)
        return treeBuilder.BooleanMethodCall(nameof(AuditableExtensions.AsOf), new[]

public class MsSql2016Dialect : MsSql2012Dialect
    public MsSql2016Dialect()
        RegisterFunction(nameof(AuditableExtensions.AsOf), new SQLFunctionTemplate(
            $"{ForSystemTimeGenerator.ForSystemTimeAsOfString} ?1?2=1"));

Can anyone provide any better approach or samples I could use to move forward and insert FOR SYSTEM_TIME AS OF statement between table name and its alias? At this moment the only solution I can see is to alter SQL in OnPrepareStatement in SessionInterceptor but I believe there is some better approach...