当前位置: 首页 > 编程语言 > C#

使用Critieria API在NHibernate中选择子查询分享

时间:2023-04-10 19:52:15 C#

C#学习教程:使用CritieriaAPI在NHibernate中选择子查询childId]aschildNodeIdfrom[Items]groupby[childId])asqinnerjoin[Items]asponp.[price]=q.[Max_Price]andp.[childId]=q.[childNodeId]我需要使用CriteriaAPI在NHibernate中重新创建此查询。我尝试使用子查询API,但它似乎需要内部查询返回单个列以检查与外部查询中的属性是否相等。但是,我得到了两个。我读过这可以通过HQLAPI完成,但我需要使用CriteriaAPI来完成,因为我们将动态生成此类查询。谁能指导我正确的方向?我设法通过稍微调整原始sql查询来解决类似的问题。我最终得到了这样的东西(伪sql代码):SELECTp.*FROM[Items]aspWHEREEXISTS(SELECT[childId]aschildNodeIdFROM[Items]asqWHEREp.[childId]=q.[childNodeId]GROUPBYq.[childId]HAVINGp.[price]=MAX(q.[price]))下面是QueryOver实现:varsubquery=QueryOver.Of(()=>q).SelectList(list=>list.SelectGroup(()=>q.ChildId)).Where(Restrictions.EqProperty(Projections.Property(()=>p.Price),Projections.Max(()=>q.Price))).And(Restrictions.EqProperty(Projections.Property(()=>p.ChildId),Projections.Property(()=>q.ChildId)));从这里您只需要传递别名,以便NHibernate可以正确解析实体(伪代码):varfilter=QueryOver.Of(()=>p).WithSubquery.WhereExists(GetSubQuery(p,criteria...));我希望这对您的具体情况有所帮助。更新:CriteriaAPIvarsubquery=DetachedCriteria.For("q").SetProjection(Projections.ProjectionList().Add(Projections.GroupProperty("q.ChildId"))).Add(Restrictions.EqProperty("p.Price",Projections.Max("q.Price"))).Add(Restrictions.EqProperty("p.ChildId","q.ChildId"));varquery=DetachedCriteria.For("p").Add(Subqueries.Exists(subquery));但是我建议坚持使用QueryOver版本,它更直观并且您可以避免魔术字符串(尤其是您不必升级NH版本)。如果这对你有用,请告诉我。以上就是C#学习教程:使用CritieriaAPI在NHibernate中选择子查询全部内容分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: