2016-12-13 12 views
1

У меня есть запрос, который использует подобный код:базы данных независимой в случайном порядке в NHibernate

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

Цель состоит в том, чтобы получить случайное упорядочение. Я запускаю его на сервере SQL, но я также хотел бы запустить его против SQLite, поскольку мы используем его для тестирования. SQLite не поддерживает NEWID(), но вместо этого имеет Random. Можно ли написать код (или настроить) таким образом, чтобы один и тот же запрос работал против обеих баз данных?

ответ

2

Я думаю, что способ сделать это - создать два пользовательских диалекта. У каждого из реализации 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))); 

Обратите внимание, что это обман немного. random не возвращает Guid в аромат Sqlite, но поскольку NHibernate не нуждается в этой информации, чтобы сделать ORDER BY, ничего не должно идти не так. Я бы назвал его random_order или что-то, чтобы было ясно, что это только для заказа.

 Смежные вопросы

  • Нет связанных вопросов^_^