20

Is there a way to get the row count of a complex Linq query and millions of records without hitting the db twice or writing 2 separate queries??

I might have my own suggestion. Write a stored procedure, but I'm good with MySQL not MSSQL.

Any better suggestions would be great. Also, if anyone knows if Microsoft is working on adding this feature to the entity framework.

4

6 に答える 6

17

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);
于 2012-04-16T22:58:33.213 に答える
4

私は最近、この Code Project の記事Entity Framework のページネーションに触発されました (コピーされました)。

コード:

public async Task<IList<SavedSearch>> FindAllSavedSearches(int page, int limit)
{
    if (page == 0)
        page = 1;

    if (limit == 0)
        limit = int.MaxValue;

    var skip = (page - 1) * limit;

    var savedSearches = _databaseContext.SavedSearches.Skip(skip).Take(limit).Include(x => x.Parameters);
    return await savedSearches.ToArrayAsync();
}

私はEntity Frameworkの経験がなく、パフォーマンスについてテストしていないので、注意して使用してください:)

于 2019-03-26T10:30:39.360 に答える
2

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

于 2012-04-13T18:23:18.803 に答える
2

迅速な解決策が必要な場合は、 XPagedList https://github.com/dncuug/X.PagedListを使用できます。XPagedList は、IEnumerable/IQueryable を簡単に取得して「ページ」に切り刻み、特定の「ページ」をインデックスで取得できるようにするライブラリです。例えば

var products = await _context.Products.ToPagedListAsync(pageNumber, pageSize)
于 2019-11-20T12:58:45.297 に答える