2012-04-13 20 views
9

複雑なLinqクエリと何百万ものレコードの行数を取得する方法はありますかなしは2回、C#エンティティフレームワークのページ区切り

私自身の提案があります。ストアドプロシージャを書くが、私はMSSQLではなくMySQLでうまくいく。

より良い提案があればうれしいでしょう。また、Microsoftがこの機能をエンティティフレームワークに追加しようとしているかどうかを知っている人は誰でも知っています。

+3

データベースにヒットしたり、実際にそれらの行を返すクエリを作成したりすることなく、クエリの行数を取得できないと確信しています。 –

+0

あなたの考えに感謝@ジョナサンウッド! –

+1

EFで.Count()を使用すると、すべての行が選択されず、 'select count()from table' sql文だけが実行されます.2つのクエリが必要ですが、そのうちの1つは非常に安いです。 –

答えて

2

数百万のレコードを表示する一般的な方法は、単にすべてのページを表示しないことです。考えてみましょう:何百万ものレコードがある場合、ページあたり20〜100個のアイテムがあれば、何万ページもあります。 それらをすべて表示することは意味がありません。現在のページを読み込んで、次のページへのリンクを提供するだけです。それだけです。 また、100-500個のレコードをロードすることもできますが、1ページしか表示されず、ロードされたレコード情報を使用して最初の数ページのページリンクが生成されます。

+0

あなたは正しいですが、私は数百または数千のリンクを表示したり、誰かがその多くのページを踏み台にしたりすることを望みません。私が抱えている問題は、ただ1つのクエリを書いてみたいということです。たとえば、MySQLでは、クエリ内でSQL_CALC_FOUND_ROWSを使用し、次にその結果を取得する別のクエリを使用できました。非常に効率的!素晴らしいページネーションを作った!あなたの考えに感謝@VladimirPerevalov! –

+0

AFAIK LINQにはMS SQL Serverのようなサポートはありません。実際にはMySqlとMS SQLには多くのことがあります。例えば。 'SELECT BETWEEN ...'はページ設定にも非常に効果的です。 –

+0

「移動先:」というテキストボックスと、特定のページに直接ジャンプするボタンを提供することもできます。 –

8

Take()関数を使用することをお勧めします。これは、linqクエリまたはリストから取るレコードの数を指定するために使用できます。例えば

List<customers> _customers = (from a in db.customers select a).ToList(); 
var _dataToWebPage = _customers.Take(50); 

ために私がセッションに_customersリストを作成し、ユーザーがその他ページ2、3をクリックしたとき、これは複数保存し、さらに、ページネーションクエリのこのリストを使用MVCアプリケーションに同様の技術を使用しデータベースヒット。しかし、あなたのリストが非常に大きい場合は、それもセッションを書くことはおそらく良い考えではありません。

ページネーションでは、Skip()とTake()関数を併用できます。たとえば、データのページ2を取得するには:

var _dataToWebPage = _customers.Skip(50).Take(50); 
+0

ありがとう@TimNewton。もちろん、大量のデータ列を含む数百万レコード以上のレコードがあれば、メモリ不足例外が発生します。 –

+0

Jasonでは、オブジェクト全体ではなく、セッションのリストにプライマリキーを書き込んだ後、リストのプライマリキーを使用してデータを再表示する必要があるたびにデータベースから詳細を取得することを検討できますか?しかし、それでも複数のデータベースの読み込みが必要です。私はあなたがデータセットが非常に大きい場合は、複数のDB読み取りせずに離れて得ることができないと思います。 –

+0

あなたは、このインスタンスのためにc#でLinqを使って1つのdbを読み取ることができないのは間違いありません。私はこれを行うことができます、それはちょうど私は強く型付けされ、私のクリーンなコードの残りと一緒にLinqを使用する能力が欲しいということを知っています。大きなデータセットや大きなデータを保持していない小さなテーブルでは、ページネーションが完璧に機能しています。 –

2

これはSQL Server上でとても簡単です。 あなたはこのクエリを書くことができます:

select count() over(), table.* from table 

数()(上)次の2つのクエリを実行する必要はありませんので、 はあなたが生を実行する必要があることを忘れないでください..結果に合計行の数を返します。あなたのコンテキストでSQLを使用するか、ビューモデルとして結果を返すdapperを使用してください。