2009-08-11 5 views
1

私は新しいLINQプロバイダを使ってLINQクエリを使って複数フィールドの検索ページに使用しているCriteriaクエリを置き換えようとしています。しかし、私はページングを実装できるようにレコード数を取得する問題に遭遇しています。私は、結果を達成しようとしている は、LINQを使用してCriteria APIからCountDistinct投影によって生成されたものと同等です。これを行う方法はありますか?NHibernate - LINQを使ったCountDistinctプロジェクションに相当

LINQによって提供されるDistinct()メソッドは、期待どおりの動作をしていないようで、フィールドによってグループ化されたLINQクエリの最後に ".Distinct()。Count()"を追加します。 (整数ID列)の別個のカウントは、それらの値の明確でないカウントを返すように見えます。

私は必要に応じて使用しているコードを提供することができますが、フィールドが非常に多いので、それは かなり長いので、必要でない場合は投稿を群集にしたくありませんでした。

ありがとうございます!

答えて

2

私はこれを行う方法を考え出しましたが、すべての状況で最適ではないかもしれません。 LINQクエリで.Distinct()を実行するだけで、実際には.Count()を指定せずに使用すると結果のSQLクエリに "distinct"が生成されます。 .Distinct()。ToList()を使用してクエリを列挙し、結果のメモリ内コレクションに.Count()メソッドを使用すると、結果が得られます。

これは、カウントが実際にアプリケーションコードで実行されており、IDのリスト全体がDBからアプリケーションに送信される必要があるため、Criteriaクエリで元々行っていたこととまったく同じではありません。私の場合は、少数の異なるIDがあれば、それはうまくいくと思いますし、パフォーマンスのボトルネックはあまりありません。

しかし、真のCountDistinct()LINQ操作が将来実現されることを期待しています。

+0

私はちょうど同じ問題に遭遇しました。これは、間違ったSQLを生成するLINQアダプタの問題のようです。同じ回避策を使用しなければならず、 'Count()'を実行する前に 'ToList()'でクエリの評価を強制する必要がありました。 –

0

最初の個数を区別したい列を選択してみることもできます。次のようになります:Select(p => p.id).Distinct()。Count()。それは、オブジェクト全体を区別しているため、実際の値ではなくオブジェクトの参照を比較します。

+0

良いアイデアと、私が試したもの。残念ながら、それは私が期待するように動作していないようです。私の状況では、実際には27個の異なるIDがテーブルにありますが、これを実行するとすべての結合で47,000のようなものが返されます。 .Distinct()。Count()を生成するクエリは、実際にはそれに "distinct"がありません。うまくいけば、将来のバージョンで変更できるもの。 –

関連する問題