C# 使用DetachedCriteria在nHibernate中进行复杂查询

C# 使用DetachedCriteria在nHibernate中进行复杂查询,c#,.net,nhibernate,C#,.net,Nhibernate,我目前正试图从手工制作的hql转变为通过DetachedCriteria构造的查询。我有和HQL: from GenericObject genericObject left join fetch genericObject.Positions positions where (positions.Key.TrackedSourceID, positions.Key.PositionTimestamp) in (select gp.Key.TrackedS

我目前正试图从手工制作的hql转变为通过DetachedCriteria构造的查询。我有和HQL:

from GenericObject genericObject 
      left join fetch genericObject.Positions positions
      where (positions.Key.TrackedSourceID, positions.Key.PositionTimestamp) in 
      (select gp.Key.TrackedSourceID, max(gp.Key.PositionTimestamp)
       from GenericPosition gp 
group by gp.Key.TrackedSourceID) 
现在使用DetachedCriteria:

var subquery = DetachedCriteria
                .For (typeof (GenericPosition), "gp")
                .SetProjection (Projections.ProjectionList ()
                                    .Add (Projections.Property ("gp.Key.TrackedSourceID"))
                                    .Add (Projections.Max ("gp.Key.PositionTimestamp"))
                                    .Add (Projections.GroupProperty ("gp.Key.TrackedSourceID"))
                );
            var criteriaQuery = DetachedCriteria
                .For (typeof (GenericObject), "genericObject")
                .CreateAlias ("genericObject.Positions", "positions")
                .SetFetchMode ("genericObject.Positions", FetchMode.Eager)
                .Add (Subqueries.In (??, subquery))

我不知道用什么来代替??要创建类似(positions.Key.TrackedSourceID,positions.Key.PositionTimestamp)的表达式

我看不到从hql迁移到DetachedCriteria的好处,如果后者更难编写的话。阅读

在我的项目中,我更喜欢使用分离标准,除非语法变得太复杂。然后我使用hql。直到它再次变得复杂。然后我在sql中进行了一次尝试,如果hql不能提高可读性,那么就返回hql


请记住,您将来必须维护这些查询。

HQL在内部完成了大量字符串操作,因此可能会产生内存问题,因为字符串是不可变的类型。建议使用DetachedCriteria而不是HQL

你说得对。然而,我正在动态地创建这个查询,并调用了一些方法来向查询中添加一些内容。在组合查询之后,我需要为参数添加值,这是非常不雅观的-DetachedCriteria在这里似乎是更好的解决方案。你是对的,我希望你的问题能够得到答案,。。。我发现自己处于类似的情况下…我有一个解决方法-我只是在DetachedCriteria中附加本机SQL命令,它执行jiob。参数的名称当然有问题,但我正在使用其他例程来确定数据库中与具体属性相对应的列的名称。如果您有太多HQL查询,以至于您的字符串导致内存问题,我会冒险猜测您做错了。