4

エンティティデータモデルを介して、約2,000万のエントリを持つMSSQLデータベースのテーブルからすべてのレコードをフェッチしようとしています。私の最初のアイデアは、次のようにデータをチャンクで取得することでした。

public IEnumerable<IEnumerable<device>> GetDevicesInChunks(int chunkSize)
{
    using (var db = new AccountsEntities())
    {
        for (int i = 0; i < db.devices.Count(); i += chunkSize)
        {
            yield return db.devices.Skip(i).Take(chunkSize);
        }
    }
}

ただし、上記の方法を使用した場合にスローされる例外から判断すると、電話をかけるOrderBy前に電話をかける必要があるようです。Skip

The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 
'OrderBy' must be called before the method 'Skip'.

デバイスが特定の順序になっていないため、取得するレコードのすべてのサブセットを呼び出すOrderByにはコストがかかると確信しています。ここでは間違った道を歩いているように感じます。

LINQを介して大規模なSQLクエリを処理するための最良のアプローチは何ですか?

4

2 に答える 2

4

このエラーは、SkipメソッドをOrderByの後に実行する必要があるために発生します。OrderByなしでスキップを実行することはできません。スキップメソッドは、最初に取るものを知る必要があります。最初のものを入力すると、選択の順序を知る必要があり、最初のものが最初から最後まで、または最後から最初までの番号であるかどうかを知る必要があります。

あなたはここでもっと読むことができます

したがって、コードは次のようになります。

public IEnumerable<IEnumerable<device>> GetDevicesInChunks(int chunkSize)
{
    using (var db = new AccountsEntities())
    {
        for (int i = 0; i < db.devices.Count(); i += chunkSize)
        {
            yield return db.devices.OrderByDescending(y => y).Skip(i).Take(chunkSize);
        }
    }
}

それが重いクエリだと思う場合、remeberEntityFrameworkはクエリとデータのキャッシュを実行できます。そのメソッドのSQLが気に入らない場合は、手動でクエリを実行できます。

個人的な経験: 私はそれを2bi行のデータベースで使用しています...それは遅くはありませんでした。しかし、テーブルにインデックスがあり、常にキャッシュを使用しています。

詳細: 必要に応じて、手順を使用できます。詳細はこちら

于 2013-03-07T00:05:50.760 に答える
-1

あなたはする必要がないかもしれませんOrderBy-あなたは単にする前にリストにデータを入力する必要があるかもしれませんSkipそしてTake。を使用し.Count()てクエリを設定でき、その後でとを使用できるSkipと思いますTake

于 2013-03-07T00:18:09.187 に答える