zoukankan      html  css  js  c++  java
  • NHibernate初探(二) 对于IList<object[]>到持久类类型的转换

    Hqlselect 语句返回Ilist<object[]>类型,如何转换为映射类型。

    (一)持久类

    public class Customer

        {

            public virtual int Unid { get; set; }

            public virtual string FirstName { get; set; }

            public virtual string LastName { get; set; }

    }

    (二)hql

    var xx =_Session.CreateQuery("select Unid,FirstName,LastName from Customer").List<object[]>();

    其中xx的类型为object[]数组的泛型列表类型。

    现在分解:

    1)方法1

    IList<Customer> mylist = new List<Customer>();

    for (int i = 0; i < xx.Count; i++)

    {

      mylist.Add(new Customer

    {   FirstName = (string)xx[i][1],

                LastName = (string)xx[i][2],

    Unid = Convert.ToInt32(xx[i][0])

    });

    }

    说明:object[]数组包括了对持久类的3个属性的装箱,分别对应

    Unid(int-object)FirstName(string-object)LastName(string-object)

    通过拆箱来还原持久类

    2)方法2

    把持久类的3个属性的拆箱封装为方法。

    public Customer GetCustomer(object[] aa)

    {

    return new Customer

    {

    FirstName = (string)aa[1],

    LastName = (string)aa[2],

    Unid = Convert.ToInt32(aa[0]

    )};

    }

     

    for (int i = 0; i < xx.Count; i++)

    {

      mylist.Add(GetCustomer(xx[i]));

     }

    3)方法3

    利用Converter 泛型委托(表示将对象从一种类型转换为另一种类型的方法。)

    相关帮助请查看其它文档。

    List<Customer> clist=new List<Customer>();

    clist = xx.ConvertAll<Customer>(new Converter<object[], Customer>(GetCustomerr));

     

    委托方法:

    public Customer GetCustomerr(object[] aa)

    {

        return new Customer

    {

    FirstName = (string)aa[1],

    LastName = (string)aa[2],

    Unid = Convert.ToInt32(aa[0]

    )};

    }

     

    会发现方法2中的封装方法与方法3中的委托是相关的!

    请大家使用第三种方法。

     

    再以select group by 为例子。

    此图为在mssql查询分析器中对目录的Customer表中的数据进行以firstname分组的列表,并显示统计数目

     

    public List<Customer> ShowSelectGroup()

    {

    List<object[]> xx = _Session.CreateQuery

    ("select FirstName,count(*) from Customer group by FirstName")

    .List<object[]>() as List<object[]>;

    List<Customer> clist = new List<Customer>();

     

    clist = xx.ConvertAll<Customer>(

    new Converter<object[], Customer>(GetCustomerGroup)

    );

    return clist;

     }

    用第三种方法实现到持久类型的转换。

    说明一下:此分组查询有两列,分别是FirstName列,与未命名的统计列。其中一个为string 类型,一种为int类型(简化考虑:长度,与其它不考虑)。

    那种如果要转换,则需要一种带2个属性的类。这里我还用Customer持久类。但不是用它的所有属性,只用它的FirstName属性和Unid属性(这里Customer类已经不存在它的意义)。

    重新定义委托方法:

    public Customer GetCustomerGroup(object[] aa)

    {

    return new Customer {

    FirstName = (string)aa[0],

    Unid = Convert.ToInt32(aa[1]

    )};

     }

    测试一下:

    ------ Test started: Assembly: SelfTest.dll ------

     

    Jimmy1:1

    Tom:3

    zsj:3

    zzy:1

     

    1 passed, 0 failed, 0 skipped, took 6.13 seconds (NUnit 2.5.0).

     

     --补充内容

    1)定义实体类(用于构建List类型,来封装返回的数据)

    public class CustomerDTO
    {

    public CustomerDTO(string fri,string las)

    {}
    public string FirstName { get; set; }
    public string LastName { get; set; }

    }
    2)利用上边的实体类型返回实体类型的List列表

    var xx =_Session.CreateQuery("select new CustomerDTO(c.FirstName,c.LastName) from Customer c")

    .List<CustomerDTO>();

     

    注:引自Lee(李永京)的讲解,更多内容请参见他的博客。

    http://www.cnblogs.com/lyj/archive/2008/10/30/1323099.html

     -------over

    博客园大道至简

    http://www.cnblogs.com/jams742003/

    转载请注明:博客园

  • 相关阅读:
    正则化方法:L1和L2 regularization、数据集扩增、dropout
    如何估算深度神经网络的最优学习率
    机器学习算法中如何选取超参数:学习速率、正则项系数、minibatch size
    leetcode 389. Find the Difference
    python导入模块
    如何选择正确的激活函数?
    leetcode 690. Employee Importance——本质上就是tree的DFS和BFS
    leetcode 258. Add Digits——我擦,这种要你O(1)时间搞定的必然是观察规律,总结一个公式哇
    leetcode 520. Detect Capital
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(12月21日)
  • 原文地址:https://www.cnblogs.com/jams742003/p/1599021.html
Copyright © 2011-2022 走看看