小马

现在是零将来是无限

导航

NHibernate 执行内嵌类(Nested Class)查询

为了使用NHibernate执行内嵌类查询,我修改了NHibernate的源代码,增加了两个语句。
/*SessionFactoryImpl.cs*/
/// 
<summary>
        /// 
        /// 
</summary>
        /// 
<param name="clazz"></param>
        /// 
<returns></returns>
        public string[ ] GetImplementors( System.Type clazz )
        {
            ArrayList results = new ArrayList();
            foreach( IClassPersister p in classPersisters.Values )
            {
                if( p is IQueryable )
                {
                    IQueryable q = ( IQueryable ) p;
                    string name = q.ClassName;

                    if(name.IndexOf("+")!=-1)
                        name = name.Replace("+","..");

                    bool isMappedClass = clazz.Equals( q.MappedClass );
                    if( q.IsExplicitPolymorphism )
                    {
                        if( isMappedClass )
                        {
                            return new string[ ] {name};
                        }
                    }
                    else
                    {
                        if( isMappedClass )
                        {
                            results.Add( name );
                        }
                        else if(
                            clazz.IsAssignableFrom( q.MappedClass ) &&
                                ( !q.IsInherited || !clazz.IsAssignableFrom( q.MappedSuperclass ) ) )
                        {
                            results.Add( name );
                        }
                    }
                }
            }
            return ( string[ ] ) results.ToArray( typeof( string ) );
        }

        /// 
<summary>
        /// 
        /// 
</summary>
        /// 
<param name="name"></param>
        /// 
<returns></returns>
        public string GetImportedClassName( string name )
        {
            // UPDATE_NOTES:resolve nested class problem
            if(name.IndexOf("..")!=-1)
                name = name.Replace("..","+");

            string result = imports[ name ] as string;
            return ( result == null ) ? name : result;
        }

现在可以在表达式中用 ParentClass..NestedCalss语法来执行查询了。

posted on 2005-05-21 15:36  mahope  阅读(609)  评论(0编辑  收藏  举报