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/

转载请注明:博客园

目录
相关文章
|
存储 C语言
用加法器实现补码的加/减运算
用加法器实现补码的加/减运算
528 0
|
11月前
|
SQL 数据管理 数据库
文章初学者指南:SQL新建数据库详细步骤与最佳实践
引言:在当今数字化的世界,数据库管理已经成为信息技术领域中不可或缺的一部分。作为广泛使用的数据库管理系统,SQL已经成为数据管理和信息检索的标准语言。本文将详细介绍如何使用SQL新建数据库,包括准备工作、具体步骤和最佳实践,帮助初学者快速上手。一、准备工作在开始新建数据库之前,你需要做好以下准备工作
798 3
|
机器学习/深度学习 索引
|
机器学习/深度学习 人工智能 vr&ar
【深度学习】python之人工智能应用篇——图像生成技术(一)
图像生成是计算机视觉和计算机图形学领域的一个重要研究方向,它指的是通过计算机算法和技术生成或合成图像的过程。随着深度学习、生成模型等技术的发展,图像生成领域取得了显著的进步,并在多个应用场景中发挥着重要作用。
235 6
|
数据库
实体类的字段和数据库中的字段不一致、并且没有做中间替换、会发生什么
这篇文章讨论了实体类字段与数据库字段不一致时可能导致的问题,作者通过实际案例展示了字段不匹配时查询无法正确执行,并说明了修正字段匹配后查询可以成功执行的情况。
实体类的字段和数据库中的字段不一致、并且没有做中间替换、会发生什么
|
SQL 人工智能 移动开发
Android 遍历界面所有的View
本文讲述如何遍历获取页面中所有的view,并输出对应的id,textview文本内容,imageview实际大小及设置的图片大小。 可用于检测android应用中的大图。
|
机器学习/深度学习 数据可视化 关系型数据库
基于机器学习的信用卡办卡意愿模型预测项目
基于机器学习的信用卡办卡意愿模型预测项目
251 3
|
数据采集 数据库 Python
为什么基于 Django 和 Scrapy 的项目需要 @sync_to_async 装饰器
通过使用 @sync_to_async 装饰器,我们可以在 Scrapy 的异步环境中高效地调用同步的 Django ORM 操作。这样可以避免阻塞事件循环,充分利用 Scrapy 的异步 I/O 优势,从而提升爬虫的性能和并发处理能力。在构建基于 Django 和 Scrapy 的项目时,理解并正确使用 @sync_to_async 是非常重要的,这将帮助你构建高效、健壮的应用程序。
|
Shell C语言 SoC
计基2—RISCV指令集介绍与汇编
计基2—RISCV指令集介绍与汇编
346 1
|
存储 JSON 安全
用户登录注册系统的安全性设计
用户登录注册系统的安全性设计
340 4