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

NHibernate泛型集合封装:Emit动态生成PersistentCollection实战 在.NET数据访问层设计中,自定义集合类型是解决一对多关系重复编码的核心技术。其本质是通过泛型抽象(如ISet<T>)解耦领域逻辑与持久化机制,利用动态代码生成(Emit)替代反射调用,实现零开销代理。该方案显著提升ORM集成效率,支撑Question-Answer、Order-Item等典型业务建模,并为领域驱动设计(DDD)中的聚合一致性提供基础设施保障。本文聚焦NHibernate场景下PersistentCollection的动态生成原理与工程落地,涵盖泛型约束设计、IL指令编写、线程安全委托构建及 阅读详情

来自: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

博客园大道至简

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

转载请注明:博客园

 

Oracle+NHibernate中Guid主键的正确实践方案 Guid(全局唯一标识符)作为分布式系统中常用的ID生成机制,在跨数据库迁移时面临存储类型不匹配、字节序不一致、索引性能下降等共性挑战。其核心原理在于将128位二进制数据以确定性方式序列化为数据库可持久化的形式,技术价值体现在避免单点ID生成器瓶颈、保障微服务间数据一致性,并支持水平扩展。典型应用场景包括金融核心系统的订单主键、日志追踪ID及多租户数据隔离。在Oracle环境中,因缺乏原生GUID类型,必须绕过NHibernate默认映射,转而采用RAW(16)字段配合自定义IUserType与Oracle 阅读详情

相关推荐

Oracle+NHibernate中Guid主键的存储与映射最佳实践

Guid(全局唯一标识符)作为分布式系统常用主键类型,其二进制本质与字符串表示间的转换逻辑,直接影响数据库存储效率、索引性能与数据一致性。在Oracle这类不原生支持Guid的数据库中,配合NHibernate等ORM框架时,若未明确约束序列化格式(如ToString("N"))和存储类型(如VARCHAR2(32)而非默认36字符),极易引发ORA-01461绑定异常、索引失效、大小写不匹配查询失败等问题。技术价值在于统一Guid的生成、传输、存储与比较语义,兼顾性能、可读性与运维友好性;典型应用场景包括

ciyinzhi8788的博客 425

IList及泛型集合类转换DataTable

/**////<summary> ///将集合类转换成DataTable ///</summary> ///<paramname="list">集合</param> ///<returns></returns> ...

weixin_30487701的博客 124

NHibernate延迟加载原理与领域模型保护机制解析

ORM框架的核心挑战在于弥合对象模型与关系数据库之间的阻抗失配。延迟加载作为关键机制,其本质并非简单拦截属性访问,而是通过动态代理在数据加载时机与业务逻辑完整性之间实现精妙平衡。NHibernate采用virtual方法+运行时子类代理的设计,确保getter/setter中的校验、计算、事件等业务逻辑不被绕过,真正支撑充血模型与DDD实践。该能力直接决定框架能否在中大型系统中长期稳定承载复杂业务规则,适用于需要强领域一致性、细粒度加载控制及高可扩展性的.NET企业级开发场景。

weixin_40192258的博客 532

C# 中 IList IEnumable 转换成 List类型

IList il=new IList(); List l = new List ( il ); 转载于:https://www.cnblogs.com/rav009/archive/2012/11/05/5131187.html

weixin_30292745的博客 396

NHibernate基础与高级应用实战教程

NHibernate是一个成熟的对象关系映射(ORM)框架,它为Java或.NET语言开发人员提供了一种方便的方式来持久化对象到关系数据库中。它通过映射文件(HBM)或Fluent NHibernate等技术实现了.NET对象与数据库表之间的映射,允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL语句。本章将深入探讨NHibernate的核心组件,并指导如何编写和使用映射文件。是NHibernate架构中的一个核心组件,它是一个线程安全的工厂类,用于创建和管理Session实例。

weixin_42452924的博客 1091

01 AUTOSAR CP标准文档阅读指南

01 AUTOSAR CP标准文档阅读指南

汽车软件工程师 | 好奇博主 | 处女座 1133

关于IList类型与IList<T>在运行时类型转换失败的问题

IList必须显示转换为IList<T>类型

SignBo-zhang 1066

PyQt5 使用QSqlDatabase连接Mysql数据库时Driver not loaded Driver not loaded

PyQt5 使用QSqlDatabase连接Mysql数据库时Driver not loaded Driver not loaded

睡觉不打呼噜的博客 1562

Ilist<object>转换成I<实体> 如何转换

ml = objects.Cast&lt;menu&gt;().ToList(); //需要 using System.Linq;  

weixin_33872566的博客 122

从菜鸟到高手:我的Abaqus壳单元S4R、S3R、S8R选择心路历程

第一次打开Abaqus的单元库时,我被琳琅满目的壳单元类型晃花了眼。S4R、S3R、S8R、STRI65、S9R5...这些看似随意的字母数字组合,背后却隐藏着影响仿真精度的关键密码。作为一名从土木工程转行到汽车结构仿真的工程师,我花了三年时间才真正理解如何根据问题特性精准选择壳单元。这段学习历程充满试错与顿悟,今天就用几个关键案例,分享我的壳单元选择方法论。

weixin_42525637的博客 417

MMI分束器仿真优化:用Lumerical FDTD实现95%耦合效率的实战技巧

本文详细介绍了使用Lumerical FDTD软件对MMI分束器进行仿真优化的实战技巧。通过构建高保真模型、精确配置光源与边界条件,并重点优化波导结构与taper设计,系统性地将器件的耦合效率提升至95%以上。文章还分享了利用参数扫描、varFDTD加速等高级方法,帮助硅光芯片设计工程师高效实现高性能MMI分束器设计。

rainy的博客 769

NHibernate 如何处理泛型业务实体类?

理论上来说,泛型业务实体类,只要实例化之后,便与普通的业务实体类并无二致,用NHibernate将其映射到数据表中也应当没有什么不同。但是,由于泛型类本身的语法格式以及实例化时可能涉及到多个程序集等因素,导致映射文件的写法与普通文件有些差异。下面就来详细讲讲这些差异。        首先,假设我们有一个程序集Assemb,其中包含泛型类Gen和一个普通类Param,我们准备用类Param来

rudaoshi的专栏 984

Solidworks钣金设计:折弯系数、K因子与折弯扣除的实战应用解析

本文深入解析Solidworks钣金设计中折弯系数、K因子与折弯扣除的核心概念与实战应用。通过厘清三者间的逻辑关系与换算方法,并结合材料特性、工艺参数及车间实测,指导工程师精准确定展开长度,确保设计图纸与加工实物的一致性,有效提升钣金件设计精度与生产效率。

weixin_29268267的博客 915

无法将类型为“NHibernate.Hql.Ast.HqlBitwiseAnd”的对象强制转换为类型“NHibernate.Hql.Ast.HqlBooleanExpression”

首先使用Expression使用动态表达式生成查询条件, Expression body = Expression.Constant(true); body = Expression.And(body, expression); 然后执行查询 session.QueryOver().Where(prediate).List(); 报错如下: 无法将类型为“NHi

lingxyd 的专栏 2078

安全运营面试总结

答案可以在我的博客中查找 1.自我介绍 2.TCP/IP七层模式 3.端口号(常见协议 数据库) 4.Owasp top 10 5.渗透测试过程 6.漏扫工具 7.中间件漏洞 8.应急响应 9.项目 10.SQL注入类型 11.TCP 三次握手 四次挥手 12.你有什么要问我的 1.自我介绍 2.项目介绍 3.宽字节注入的原理 4.渗透流程 5....

qq_51577576的博客 4412

针对小缺陷目标:在YOLOv11中引入小目标检测层

摘要: 针对YOLOv11在工业检测中漏检微小目标(如焊点气泡)的问题,研究发现深层特征下采样导致小目标信息丢失。通过在YOLOv11中增加P2检测层(4倍下采样)并融合浅层高分辨率特征,可显著提升小目标召回率。关键优化包括:调整模型结构、谨慎设计数据增强策略(减少MixUp、增加小目标粘贴)、重新分配损失权重(提升P2层权重)、优化推理速度(动态分辨率、通道裁剪)。同时强调数据质量的重要性,建议根据具体场景特性(目标尺寸、分布)定制方案,而非盲目调整模型。

as1225120794的博客 366

自定义NHibernate映射类型

由于项目需要,需要一个Time结构,因为需要和DateTime对象进行换算,因此是一个采取和DateTime一样的Tickets方式保存数值,在数据库保存的是long型。因为不想为了Mapping而污染Domain,所以就增加自定义射的对象TimneType。 因为一个Time对象只需要一个Column保存,并且是一个值类型,所以没有从IUserType继承,而选择了NHi...

weixin_30567471的博客 147

NVIDIA Jetson之交叉编译工具

参考:http://bbs.xfyun.cn/forum.php?mod=viewthread&amp;tid=33630 用TX2做红外热成像仪的识别,厂家不提供源码,只能提供对应版本的SDK,但是需要我们自己提供交叉编译器 由于之前没有做过交叉编译相关工作,对编译工具不太了解,因此查找相关资料学习下 交叉编译知识 一般来说,针对嵌入式平台的开发有两种编译模式:原生编译和交叉编译。原生编...

ZONGXP的博客 8382

NHibernate调用Oracle存储过程实战指南

存储过程是Oracle数据库中封装核心业务逻辑的关键技术,具备强事务性、高性能计算与安全隔离等优势;其原理依赖PL/SQL引擎在服务端执行预编译代码,避免网络往返与SQL注入风险;技术价值在于复用成熟逻辑、保障数据一致性、降低应用层复杂度;典型应用场景包括金融核算、社保待遇计算、审计日志生成等需严苛验证的领域;而NHibernate作为深度支持Oracle特性的成熟ORM,不仅能调用存储过程,更提供类型化映射、REF CURSOR自动装配、事务穿透及二级缓存集成能力,尤其适合对接遗留PL/SQL包与复杂结果

clugcpne10995的博客 367

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NHibernate 之 “ 值“System.Object[]”不是“”类型,不能在此泛型集合中使用。 参数名: value”

public IList GetItemList(int Brand_ID, int pageNo, int pageSize, out int TotalNumber) { IList List; ICriteria critRecordCount = NHibernateSession

码农 4775

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

NHibernate 基本值类型

基本值类型(Basic value types) 基本的值类型大致可以粗糙的分为三组:System.ValueType类型,System.Object类型和支持大对象的System.Object类型.和.NET类型一样,System.ValueType对应的列不能存储null值,而System.Object可以. 表4.3 System.ValueType 映射类型 NHib...

weixin_30458043的博客 138

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

使用NHibernate的时候出现“指定的转换无效”的错误

指定的转换无效,一般是数据类型不匹配导致的。检查NHibernate的类文件和.hbm.xml文件中的类型描述是否一致。 转载于:https://www.cnblogs.com/jasondan/archive/2011/08/10/2134217.html...

weixin_30455365的博客 401

NHibernate 事务查询的更新事件

一个简单的Nhibernate查询,居然有Update事件。 ISessionFactory sessionFactory = cfg.BuildSessionFactory(); using (ISession session = sessionFactory.OpenSession()) { ITransaction tran = session.BeginTransacti...

weixin_30478923的博客 214
上一篇: 公共代码帮助类:下载页面、导出Excel(不带表头)、导出Execl(带表头)、 导出CSV、实现对IList到DataSet的转换
下一篇: NHibernate 优秀博客专题
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值