NHibernate初探(二) 对于IList<object[]>到持久类类型的转换

简介: Hql的select 语句返回Ilist类型,如何转换为映射类型。 (一)持久类 public class Customer     {         public virtual int Unid { get; set; }         public virtual stri...

 

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/

转载请注明:博客园

目录
相关文章
|
6月前
|
存储 Java
map中存储的是引用,而不是对象本身
该内容是关于Java编程中验证Map存储引用而非复制对象的示例。创建大型List导致内存增加,说明List确实占用空间。通过Person类示例,将不同对象放入Map,改变一个对象的属性后,比较原对象与Map中的键值对,发现两者相等,证明Map保存的是对象引用。
92 5
|
6月前
|
JavaScript 前端开发 定位技术
JavaScript 中如何代理 Set(集合) 和 Map(映射)
JavaScript 中如何代理 Set(集合) 和 Map(映射)
103 0
|
fastjson
Map对象与实体类Object对象转换
Map对象与实体类Object对象转换
|
存储 JSON 数据格式
Map对象和普通对象的7个区别
Map对象和普通对象的7个区别
|
存储 Java 对象存储
基础篇:Object对象
内存对齐区是什么? HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说就是对象的大小必须是8字节的整数倍。因此当对象实例数据部分没有对齐的话,就需要通过对齐填充来补全
73 0
|
JSON 数据格式
将Object类对象转为对应实体类对象
将Object类对象转为对应实体类对象
467 0
|
JSON 数据格式
SpringMVC - 数据绑定(基本数据、包装类、数组、对象、集合:List、Set、Map、Json)(一)
SpringMVC - 数据绑定(基本数据、包装类、数组、对象、集合:List、Set、Map、Json)(一)
160 0
SpringMVC - 数据绑定(基本数据、包装类、数组、对象、集合:List、Set、Map、Json)(一)
|
Java Spring
Spring注入集合(数组、List、Map、Set)类型属性
Spring注入集合(数组、List、Map、Set)类型属性
|
测试技术
Object C学习笔记3-对象的使用和定义
  1. 如何定义一个对象   在面向对象的语言中,定义一个对象是使用Class关键字,而在Object-C中则是使用@interface,@interface用于定义对象的属性和方法,@implementation则用于对象的详细描述。
858 0