NHibernate QueryOver查询如何优先取非空的关联Account.Name字段
问题原因
你之前的写法错误是因为NHibernate的QueryOver表达式需要被转换为SQL在数据库端执行,直接使用C#原生三目运算符判断实体别名是否为空,无法被正确解析为SQL层面的空值判断逻辑:
- 第一种写法的三目逻辑在表达式解析阶段就触发了空引用异常
- 第二种写法被NHibernate错误解析为返回实体对象的主键值,而非你需要的
Name属性
解决方案
使用NHibernate内置的Projections.Coalesce方法,对应SQL标准的COALESCE函数,按优先级取两个Name属性的值,直接替换原来的查询行即可:
// 需提前引入命名空间 using NHibernate.Criterion; .Select(Projections.Coalesce( Projections.Property(() => claimCompany.Name), Projections.Property(() => billingAdjusterCompany.Name) )).WithAlias(() => pi.BillingAdjusterCompanyName)
这个写法会直接生成类似COALESCE(claim_company.name, billing_adjuster_company.name)的SQL逻辑,在数据库层面完成空值判断和优先级取值,完全符合需求,也不会出现空引用或者取错字段的问题。
内容的提问来源于stack exchange,提问作者nkahootzShawn
相关产品推荐
相关产品推荐

