Hql的select 语句返回Ilist<object[]>类型,如何转换为映射类型
来源:互联网 发布:好看的男同网络剧电影 编辑:程序博客网 时间:2024/05/16 02:05
http://www.cnblogs.com/jams742003/archive/2009/11/09/1599021.html
Hql的select 语句返回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
- Hql的select 语句返回Ilist<object[]>类型,如何转换为映射类型
- Hibernate(HQL/SQL)查询结果(Object)转换为实体类型
- HQL语句中的类型转换
- HQL语句中的类型转换
- 字符串数组类型的object,如何转换为string[],
- java中如何将Object类型转换为int类型
- NHibernate初探(二) 对于IList<object[]>到持久类类型的转换
- Object类型转换为String类型的两种方式
- Interop.Domino.dll函数返回类型为Object的转换对照表
- Object类型转换为Integer:
- Object类型转换为int类型
- Java object类型转换为int类型
- hibernate hql语句如何获取枚举类型
- 关于IList类型与IList<T>在运行时类型转换失败的问题
- list类型的变量为一个条件,如何拼写HQL
- 无法将类型为“NHibernate.Hql.Ast.HqlBitwiseAnd”的对象强制转换为类型“NHibernate.Hql.Ast.HqlBooleanExpression”
- Object转换为String[]数组,或者其他类型的数组
- Object转换为String[]数组,或者其他类型的数组
- JS判断浏览器类型与版本
- WebKit – WebKit For Android
- window xp 装虚拟机Red Hat Linux 6,用ssh、 FlashFXP等工具进行连接
- 1.第六章2
- 虚拟化并非私有云
- Hql的select 语句返回Ilist<object[]>类型,如何转换为映射类型
- HDU 1180 诡异的楼梯
- A. Lucky Division
- 中国围棋借应氏杯而涅槃
- log4j中配置日志文件几种方式
- 广义表建立二叉树
- apk文件反编译工具和步骤小结
- 新手的一些废话
- 百度称政府网站最易遭攻击