NHibernate предназначен для работы с диалектами SQL, а не с специальными языками запросов. Это будет очень сложно сделать. Но чтобы ответить на ваш вопрос, вам необходимо:
- Поставщик ADO.NET для вашей базы данных (это будет отдельный вопрос).
Класс драйвера (производный от DriverBase NHibernate). Вот что я написал в прошлом (несколько анонимно):
public sealed class XxxClientDriver : DriverBase
{
public override IDbConnection CreateConnection()
{
return XxxClientFactory.Instance.CreateConnection();
}
public override IDbCommand CreateCommand()
{
return XxxClientFactory.Instance.CreateCommand();
}
public override bool UseNamedPrefixInSql
{
get { return true; }
}
public override bool UseNamedPrefixInParameter
{
get { return true; }
}
public override string NamedPrefix
{
get { return "@"; }
}
}
Возможно (определенно в вашем случае) диалект, производный от класса Dialect NHibernate, который определяет классы для визуализации каждого конкретного элемента синтаксиса в вашем языке (заметьте, однако, что это все еще ориентируется на SQL, Подозреваю, где вы собираетесь упасть здесь). Пример в моем случае:
public sealed class XxxDialect : Dialect
{
public override JoinFragment CreateOuterJoinFragment()
{
return new XxxJoinFragment();
}
}
Столько элементов нестандартного синтаксиса (по сравнению с обычным SQL), сколько имеется в вашем языке. Опять пример из моего дела:
public sealed class XxxJoinFragment : JoinFragment
{
private readonly SqlStringBuilder _afterFrom;
public XxxJoinFragment()
{
_afterFrom = new SqlStringBuilder();
}
private SqlStringBuilder AfterFrom
{
get { return _afterFrom; }
}
public override SqlString ToFromFragmentString
{
get { return _afterFrom.ToSqlString(); }
}
public override SqlString ToWhereFragmentString
{
get { return SqlString.Empty; }
}
public override void AddJoin(string tableName, string alias,
string[] fkColumns, string[] pkColumns,
JoinType joinType)
{
AddCrossJoin(tableName, alias);
}
public override void AddJoin(string tableName, string alias,
string[] fkColumns, string[] pkColumns,
JoinType joinType, string on)
{
AddJoin(tableName, alias, fkColumns, pkColumns, joinType);
}
public override void AddCrossJoin(string tableName, string alias)
{
AfterFrom.Add(", ").Add(tableName).Add(" ").Add(alias);
}
public override void AddJoins(SqlString fromFragment, SqlString whereFragment)
{
AddFromFragmentString(fromFragment);
}
public override bool AddCondition(string condition)
{
return true;
}
public override bool AddCondition(SqlString condition)
{
return true;
}
public override void AddFromFragmentString(SqlString fromFragmentString)
{
AfterFrom.Add(fromFragmentString);
}
}
Как вы можете видеть, в моем случае (язык запросов на основе SQL с неявными условиями соединения) это было не слишком сложно. Но в вашем случае я подозреваю, что вы будете против этого. Удачи!