NHibernate中的数据库独立随机顺序

时间:2016-12-13 15:56:24

标签: sqlite nhibernate

我有一个使用代码的查询:

criteria.AddOrder(
    Order.Asc(
        Projections.SqlFunction(
           new StandardSQLFunction("NEWID"), 
           new NHType.GuidType(), 
           new IProjection[0])));

目的是获得随机排序。我在SQL服务器上运行它,但我也想对SQLite运行它,因为我们使用它来进行测试。 SQLite不支持NEWID(),而是Random。是否可以编写代码(或配置),以便相同的查询可以对两个数据库起作用?

1 个答案:

答案 0 :(得分:3)

我认为这样做的方法是创建两个自定义方言。让每个人以不同的方式实现"File 'C:.../src/assets/pixi.js.d.ts' is not a module. at line 1 col 24"功能:

random

现在,以下查询在任一数据库中都可以正常工作:

public class MyMsSqlDialect : MsSql2012Dialect
{
    protected override void RegisterFunctions()
    {
        base.RegisterFunctions();
        RegisterFunction("random", new StandardSQLFunction("NEWID", NHibernateUtil.Guid));
    }
}

public class MySqliteDialect : SQLiteDialect
{
    protected override void RegisterFunctions()
    {
        base.RegisterFunctions();
        RegisterFunction("random", new StandardSQLFunction("random", NHibernateUtil.Guid));
    }
}

请注意,这是作弊。 criteria.AddOrder( Order.Asc( Projections.SqlFunction("random", NHibernateUtil.Guid))); 不会在Sqlite风格中返回random,但由于NHibernate不需要该信息来执行Guid,因此不会出现任何问题。我会考虑将其称为ORDER BY或其他东西,以明确这只是为了订购。