2009-07-10 23 views

回答

9

NHibernate设计用于使用SQL的方言而不是ad hoc查询语言。这将是非常棘手的事情。但要回答您的问题,您需要:

  1. 您的数据库的ADO.NET提供程序(这将是一个单独的问题)。
  2. 驱动程序类(从NHibernate的DriverBase派生)。这是一个我已经写在过去(有点匿名):

    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 "@"; } 
        } 
    } 
    
  3. 可能(绝对是您的情况)的话,从NHibernate的方言类,它定义类来呈现每个特定语法元素在你的语言派生(但请注意,这仍然是以SQL为导向的,这是我怀疑你会在哪里跌倒在这里)。在我的情况的一个例子:

    public sealed class XxxDialect : Dialect 
    { 
        public override JoinFragment CreateOuterJoinFragment() 
        { 
         return new XxxJoinFragment(); 
        } 
    } 
    
  4. 由于很多不规范的语法元素(相对于普通的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的查询语言),这是不是太难。但在你的情况下,我怀疑你会反对它。祝你好运!