🌊

[Tips] C#

2021/12/12に公開

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