1

Linq2Sql でデータテーブルのデータを準備しています

このコードは、「IEnumerable の可能な複数列挙」として強調表示されます (Resharper 内)。

// filtered is an IEnumerable or an IQueryable

var total = filtered.Count();

var displayed = filtered
                .Skip(param.iDisplayStart)
                .Take(param.iDisplayLength).ToList(); 

そして、Resharper が正しいと 100% 確信しています。

警告を回避するためにこれを書き直すにはどうすればよいですか

明確にするために、フィルターの最後にToListを配置して、データベースに対して1つのクエリのみを実行できることがわかりました。

 var filteredAndRun = filtered.ToList();

 var total = filteredAndRun.Count();

 var displayed = filteredAndRun
                .Skip(param.iDisplayStart)
                .Take(param.iDisplayLength).ToList(); 

しかし、これにより、ネットワーク経由で転送したいよりも多くのデータが返されます。

ケーキを持って食べられないことを期待しています。:(

4

2 に答える 2

2

IQueryable<T>よりも複数の列挙に関心があるようですIEnumerable<T>

ただし、あなたの場合、それは問題ではありません。

このCount呼び出しは、シンプルで非常に高速な SQL カウント クエリに変換されます。実際にレコードを戻すのは 2 番目のクエリだけです。

の場合IEnumerable<T>、データはメモリ内にあり、いずれにしても超高速です。

私はあなたのコードをそのままにしておき、重大なパフォーマンス上の問題があることに気付いたときだけ、パフォーマンスのチューニングについて心配します. :-)

于 2012-05-21T00:26:58.387 に答える
0

次のようなこともできます

count = 0;
displayed = new List();
iDisplayStop = param.iDisplayStart + param.iDisplayLength;
foreach (element in filteredAndRun) {
    ++count;
    if ((count < param.iDisplayStart) || (count > iDisplayStop))
          continue;
    displayed.Add(element);
}

これは明らかに疑似コードであり、エッジ条件では 1 つずつずれている可能性がありますが、そのアルゴリズムは 1 回の反復でカウントを取得し、最後にのみ表示される項目のリストを取得します。

于 2012-12-12T17:30:20.473 に答える