我有一个使用代码的查询:
criteria.AddOrder(
Order.Asc(
Projections.SqlFunction(
new StandardSQLFunction("NEWID"),
new NHType.GuidType(),
new IProjection[0])));
目的是获得随机排序。我在SQL服务器上运行它,但我也想对SQLite运行它,因为我们使用它来进行测试。 SQLite不支持NEWID()
,而是Random
。是否可以编写代码(或配置),以便相同的查询可以对两个数据库起作用?
答案 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
或其他东西,以明确这只是为了订购。