Pandora Pocket

IT系と日常系の備忘録。三日坊主。

よく考えればそりゃそうか感はあるんですが。

Entity Framework 3.0 Coreでは破壊的変更としてLINQ クエリがクライアントで評価されなくなった という修正があります。

.NETの関数を内部的に使っているなどして、SQLに変換できない系統のものが動かなくなったんですが、それに関係なさそうな LastOrDefault も利用できなくなっていました。

例えばこんな感じのLINQ。

await Context.Set<TBL>()  
    .Where(r => r.COLUMN1 == "hoge")  
    .Select(s => s.COLUMN2)  
    .LastOrDefaultAsync();  

GitHubのIssueを見てると該当するものが。

In EF Core 3.1: calling LastOrDefault(), Last(), LastOrDefaultAsync() or LastAsync() on entity with OwnsOne throws InvalidOperationException. FirstOrDefault is working. Steps to reproduce I have a ...
[はてなブックマークで表示]

対応としては OrderByDescending()を使って明示的に降順に並び替えてからFirstOrDefaultAsync()を呼び出す感じ。
LastOrDefaultAsync()だと結果が確定的でない可能性があるので、厳密に判定できるようにこういう対応をしたようで。

つい最近のEFCoreへのP-rで、もう少しわかりやすいエラーメッセージになるようです。

Summary of the changes Added throw to TranslateLastOrDefault to give a friendly exception Not great at exception message text at the best of times. I went with: When performing a Last() operation...
[はてなブックマークで表示]