3

我正在尝试通过它的孩子的总和来订购一个 Linq to NHibernate 查询。

session.Linq<Parent>().OrderBy( p => p.Children.Sum( c => c.SomeNumber ) ).ToList()

这似乎不起作用。查看 NHProf 时,我可以看到它是按 Parent.Id 排序的。我想也许它正在返回结果并在 SQL 之外对它们进行排序,但是如果我在 Linq 查询中添加一个 .Skip ( 1 ).Take( 1 ),它仍然按 Parent.Id 排序。

我尝试使用内存列表执行此操作,并且效果很好。

我做错了什么,或者这是 Linq to NHibernate 的问题吗?

我确信我总是可以返回列表,然后对它们进行操作,但这不是一个理想的解决方法,因为我不想返回所有记录。

4

1 回答 1

2

要按聚合值对查询进行排序,您需要使用按查询分组。在您的示例中,您需要使用带有连接的“分组依据”。

等效的 SQL 将类似于:

select id, sum(child.parentid) as childsum from dbo.Parent
inner join child on
parent.id= child.parentid 
group by id
order by childsum desc

如果只有Linq2NH 可以为我们做到这一点……但遗憾的是它不能。您可以在 HQL 中执行此操作,只要您可以获取 id 并返回总和,但不能获取整个对象。

在我放弃它之前,我与 Linq2NH 战斗了几个月。它很慢,不支持二级缓存,只支持非常基本的查询。(至少当我在 6 个月前放弃它时——它可能已经突飞猛进了!)如果您正在做一个简单的自制应用程序,那很好。如果您的应用程序甚至非常复杂,请放弃它并花一些时间了解 HQL:有点难理解但功能更强大。

于 2009-11-04T21:56:46.877 回答