请问一般Nhibernate都是返回一个对像但是这样是不是很浪费资源因为我可能不需要这个对像的所有属性请问有什么办法可以返回指定的属性
例如一张user表 有姓名、性名、年纪这一个字段
但我只想得到姓名这个字段要用什么办法???

解决方案 »

  1.   

    面向对象编程,要为要创建不同的各个对象,资源的消耗也会比较多,但这样却使得它的扩展性和复用性得到大大的提高.对于现在的硬件条件,这一点点资源浪费就变得无关紧要.
    楼主你的问题,要朝面向对象的思想去理解:
    User对象,三个属性(Name,Sex,Age)
    既然你要返回一个对象,那它的属性自然也会返回(不用的就不赋值)
    如果你只想返回Name字段,可以通过创建一个只包含Name字段的基类,然后返回基类,但这种方式会使得后期的维护很麻烦.PS:DataSet也有它自己的好处,特别在数据的处理方面
      

  2.   

    Select 字段 from 表 where 字段=...;
    在使用DataSet进行数据绑定,这个时候,绑定的数据字段为你SQl查询的字段就可以了!
      

  3.   

    那楼主为什么一定要用它呢。它返回的只是一个对象。与其用它,不如直接用dataset或是datareader来处来更好一些啊
      

  4.   

    如果不用返回对象,可以将它放在一个List中或者object中,然后再遍历List或者Object 以下提供两个函数,给搂主参考
           public IList GetEmployeeInfo(string userName)
            {
                Ilist list;
                ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();
                ISession session = sessionFactory.OpenSession();
                ITransaction tx = session.BeginTransaction();
                try
                {
                    IQuery query = session.CreateQuery("select userName from User as u where u.userName = '" + userName+ "'");
                    list = query.List();
                }
                catch (Exception exp)
                {
                    throw (exp);
                }
                session.Close();
                return list;
            }
            public virtual ArrayList GetAllEntities(string hql)
            {          
                ISession session = NHibernateHelper.GetCurrentSession();
                ITransaction tx = session.BeginTransaction();
                ArrayList list = (ArrayList)session.Find(hql);
                NHibernateHelper.CloseSession();
                return list;
            }
      

  5.   

    public   IList   GetEmployeeInfo(string   userName) 
                    { 
                            Ilist   list; 
                            ISessionFactory   sessionFactory   =   new   Configuration().Configure().BuildSessionFactory(); 
                            ISession   session   =   sessionFactory.OpenSession(); 
                            ITransaction   tx   =   session.BeginTransaction(); 
                            try 
                            { 
                                    IQuery   query   =   session.CreateQuery( "select   userName   from   User   as   u   where   u.userName   =   ' "   +   userName+   " ' "); 
                                    list   =   query.List(); 
                            } 
                            catch   (Exception   exp) 
                            { 
                                    throw   (exp); 
                            } 
                            session.Close(); 
                            return   list; 
                    } 
                    public   virtual   ArrayList   GetAllEntities(string   hql) 
                    {                     
                            ISession   session   =   NHibernateHelper.GetCurrentSession(); 
                            ITransaction   tx   =   session.BeginTransaction(); 
                            ArrayList   list   =   (ArrayList)session.Find(hql); 
                            NHibernateHelper.CloseSession(); 
                            return   list; 
                    }
      

  6.   

    呵呵谢谢大家不过我觉得大家没有太理解我的意思!!
    因为我的架构是MVC 前台是VM页面 没有DataSet。
      

  7.   

    而且我觉得Nhibernate应该就是让我们少用SQl吧!!!
    所以我都是能用基类实现的都不自己写SQL
      

  8.   

    我来排版一下代码:
                  public   IList   GetEmployeeInfo(string   userName) 
                    { 
                            Ilist   list; 
                            ISessionFactory   sessionFactory   =   new   Configuration().Configure().BuildSessionFactory(); 
                            ISession   session   =   sessionFactory.OpenSession(); 
                            ITransaction   tx   =   session.BeginTransaction(); 
                            try 
                            { 
                                    IQuery   query   =   session.CreateQuery( "select   userName   from   User   as   u   where   u.userName   =   ' "   +   userName+   " ' "); 
                                    list   =   query.List(); 
                            } 
                            catch   (Exception   exp) 
                            { 
                                    throw   (exp); 
                            } 
                            session.Close(); 
                            return   list; 
                    } 
                    public   virtual   ArrayList   GetAllEntities(string   hql) 
                    {                     
                            ISession   session   =   NHibernateHelper.GetCurrentSession(); 
                            ITransaction   tx   =   session.BeginTransaction(); 
                            ArrayList   list   =   (ArrayList)session.Find(hql); 
                            NHibernateHelper.CloseSession(); 
                            return   list; 
                    }
      

  9.   

    如果楼主你坚持用纯面向对象的思想编程,你就直接返回那个类,100多个属性,其实也只是浪费了一点指针占用的内存而已,不用太在意.这样的话,也符合MVC的思想!如果注重效率,性能,可以通过返回字符串或数据的方式,避开返回对象以节省内存资源.
    //而且我觉得Nhibernate应该就是让我们少用SQl吧!!! 
    //所以我都是能用基类实现的都不自己写SQL我对楼主的这点认识有保留意见.我们的实体对象,只是对数据表的一个映射,俗称"ORM",使得编程人员不用面向于关系数据库,直接面向于"对象"编程.但最终与数据库的数据交换,还是要通过SQL来读写
      

  10.   

    个人觉得楼上的兄弟说的方案都不可避免的会有SQL注入的风险:
    如果有一个用户在输入时username时使用 test' and '1'='1 时,任何数据都会被显示出来。另外ydsunny(小强)同学说直接返回100多个属性只是浪费一点指针而已这是不对的,如果你的表中还有image等大字段,那么由nhibernate生成的SQL语句执行速度就会很慢。还是qufo等同学的方案比较好