您的位置:首页 > 移动开发 > Objective-C

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

2012-06-15 18:28 513 查看
来自:/article/4994249.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(李永京)的讲解,更多内容请参见他的博客。
/article/6947986.html
-------over

博客园大道至简

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

转载请注明:博客园
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐