8

Logs リポジトリには次の 2 つの方法があります。

public IEnumerable<Log> GetAll()
{
   var db = new CasLogEntities();
   return db.Logs;
}           


public DbSet<Log> GetAllSet()
{
   var db = new CasLogEntities();
   return db.Logs;
}           

唯一の違いは、一方が Log の IEnumerable を返し、もう一方が Log の DbSet を返すことです。

私の資産コントローラーには、次のコードがあります

var allLogs = _logRepo.GetAllSet();
var Logs = (from log in allLogs
              group log by log.DeviceId
              into l
              select new {DeviceId = l.Key, TimeStamp = l.Max(s => s.TimeStamp)}).ToList();

問題は、呼び出すレポ メソッドのいずれかに応じて、group by ステートメントでパフォーマンスに大きな違いが生じることです。

  • DbSet を返す getAllSet は非常に高速です。
  • GetAll が返す IEnumerable は本当に遅いです。

誰でもこれを説明できますか。GetAll で DbSet を IEnumerable に変換すると、クエリが実行されるため、大量のメモリ セットでグループ化を行っていたと考えていました。一方、GetAllSet は「ToList()」までクエリの実行を延期していたため、サーバー上でグループごとの作業を行っていました。

これは正しいです?これを説明する別の方法はありますか?

私は GetAll が IEnumerable を返すことを好みます。これは、IEnumerable に慣れていて、テストが少し簡単だからです。

4

1 に答える 1

11

いいえ、変換しIEnumerable<T>ても実行されません。

一方、クエリをオブジェクト空間に取り込むため、匿名型に射影すると、生成される SQL が異なりますSQL Server Profiler を見て違いを確認してください。

これにより、パフォーマンスの違いが説明されます。

IQueryable<T>の代わりに戻った場合IEnumerable<T>、SQL/パフォーマンスは同じである必要があります。

于 2012-08-14T02:40:22.303 に答える