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 に慣れていて、テストが少し簡単だからです。