3

子の合計でL​​inqから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

集計値でクエリを並べ替えるには、group by クエリを使用する必要があります。あなたの例では、結合で「グループ化」を使用する必要があります。

同等の 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だけが私たちのためにこれを行うことができれば... しかし、残念ながらそれはできません。オブジェクト全体ではなく、IDと合計を取得しても問題ない限り、HQLで実行できます。

私はLinq2NHを放棄するまで何ヶ月も戦いました。その速度は遅く、第 2 レベルのキャッシュをサポートしておらず、非常に基本的なクエリしかサポートしていません。(少なくとも私が 6 か月前に放棄したときは、飛躍的に向上した可能性があります!) 簡単な自家製アプリケーションを実行している場合は問題ありません。アプリケーションが少しでも複雑である場合は、それを捨てて、少し時間をかけて HQL を理解してください。理解するのは少し難しくなりますが、はるかに強力です。

于 2009-11-04T21:56:46.877 に答える