🌊
[Tips] C#
C# で詰まりそうなとこや、便利な書き方などを随時追記する。
- 前提
- C#: 7.0~
- .NET: 4.8
- MVC: 5
- Entityframework: 6
IEnumerable<T>
のWhere条件を多用しない
IEnumerable<T>
は遅延評価であることを意識する。
具体例として、DB から取得したリストに対し、
IEnumerable<T>
で Where 条件を何回も重ねて Razor ビューでリストを表示しようとすると、
遅延評価時にフリーズしてビューが永遠に読み込み中となる場合あり。
- 例)
var list = query.Where(q => q.Hoge == "Hoge");
var list02 = list.Where(q => q.Fuga == "Fuga");
...
// 何度もWhere条件をかけ続けて IEnumerable<T>で返し続けた後、
// Razor で foreach(var item in list.ToList())
適切な箇所(Controller や ViewModel など)で ToList()
することにより、この問題は発生しない。
DBContext
が別の IQuerable<T>
は join できない
Repository を new する度に DBContext
も新しいインスタンスとなる構成の場合、
複数の Repository で IQuerable<T>
で結果を受け取り、
それぞれの結果から join して利用できない。
- 例)
using (var repHoge = new HogeRepository())
using (var repFuga = new FugaRepository())
{
var queryHoge = repHoge.Get();
var queryFuga = repFuga.Get();
var hogeHoge =
from hoge in queryHoge
join fuga in queryFuga
on hoge.Id equals fuga.Id // ランタイムエラー
select hoge;
}
例)のような使い方をしたい場合は、
リクエストごとに同じ DBContext
を利用するなど工夫が必要。
Discussion