🍙

.NET 10のEntity Framework Coreの新機能

に公開

登壇してお話しました

.NETラボ 勉強会 2025年11月でお話してきました.
2回目の登壇でした...
アーカイブもあります.
資料はこちら.
https://speakerdeck.com/htkym/dot-net-10noentity-framework-corenoxin-ji-neng

内容

つい先日に,.NET10リリースされました!
本内容は.NET 10のEntity Framework Coreの新機能・アップデート内容をまとめています.

はじめに

  • Entity Framework Core (EF Core) は,Microsoft から提供されている OR マッパー(オブジェクトとリレーショナルデータベースのマッピングを行う仕組み)であり,.NET のエコシステム内で広く使用されています.
  • EF Core は,.NET Core と完全に統合されており,パフォーマンス改善と軽量化が図られた Entity Framework の後継です.
  • .NET 10 でリースされた EF Core の主なアップデートは,堅実的な改善や,AI 関連機能,データベース操作の柔軟性向上に焦点を当てています.

1. LINQ IN クエリの最適化(パディング付きオプションの導入)

LINQ の IN 句を使用するクエリのパフォーマンスが改善され,特にデータベースのクエリプランキャッシュの汚染を防ぐための新しいオプションが導入されました.

  • 背景:
    • .NET 7 以前では,パラメーターを直接 SQL に埋め込む「インライン SQL」が使用され,クエリが変わるたびにプランキャッシュが汚染され,パフォーマンスが低下する問題がありました.
    • .NET 8 では,これを避けるために JSON 配列パラメーターが導入されましたが,データベースのプランナーがデータ数を把握できず,カーディナリティ推測の失敗により,別のパフォーマンス低下を引き起こしました.
  • 新機能(.NET 10):
    • パディング付き (Padding) オプションが追加されました.これは JSON 配列パラメーターを使用しつつ,クエリプランキャッシュを再利用しやすくするために,配列に余分な値を付けて数をパディングして SQL を流す仕組みです.
    • ユーザーによる選択: ユーザーは,接続文字列のオプションや,クエリごとの設定で,インライン,JSON 配列,またはパディング付きのいずれの戦略を使うかを選択できるようになりました.

2. ネイティブ JSON サポートの強化

JSON データの扱いがより効率的かつ容易になりました.これは Azure SQL Database と SQL Server 2025 でサポートされています.

  • C# オブジェクトの JSON への埋め込み: C# のオブジェクトを JSON のままデータベースに格納できるようになりました.
  • JSON 内部プロパティの更新: データ内のプロパティを更新するための細かいメソッドが多数提供され,効率的なデータ操作が可能になりました.

3. Complex Types(複合型)の利用推奨と改善

Value Object (値オブジェクト) などの実装に適した Complex Types が正式に推奨され,そのパフォーマンスと使いやすさが向上しました.

  • 背景:
    • 以前は Owned Types(所有型)が使われていましたが,これは内部的に ID を持つため,Value Object のセマンティクス(値が同じであれば等しいと見なす特性)に反する問題がありました.
  • 新機能(.NET 10):
    • Complex Types は内部でキーを持たないため,値のみを見て扱うことができ,真の意味での Value Object として機能します.
    • 格納方法として,テーブル分割(デフォルト)と ToJson() を使用した JSON 格納の2通りを選択できます.
    • ExecuteUpdate の改善: バルクアップデートを行う ExecuteUpdate の引数がデリゲートを受け付ける形式に変わり,条件式などを簡単に記述できるようになり,Complex Types との相性も良くなりました.

4. 外部結合(Left/Right Join)演算子の導入

LINQ で外部結合(Outer Join)を記述するための専用演算子が追加され,可読性が大幅に向上しました.

  • 背景:
    • 以前の EF Core では,LeftJoinRightJoin に相当する演算子がなかったため,外部結合を実現するには GroupJoinDefaultIfEmptySelectMany を組み合わせる複雑な記述が必要でした.
  • 新機能(.NET 10):
    • LeftJoin および RightJoin メソッドが導入され,簡潔に外部結合を記述できるようになりました.
    • ※ この機能はメソッド構文でのみ利用可能であり,クエリ構文では使用できません.

5. ベクトル検索(Vector Search)のデフォルトサポート

AI 関連機能として,データベースでのベクトル検索がデフォルトでサポートされるようになりました.

  • 利用方法: SqlVector 型が使用可能になり,EF.Functions.VectorDistance 関数を使って類似性に基づく検索を実行できます.

6. クエリフィルターの強化(複数・名前付きフィルター)

アプリケーション全体に適用されるクエリフィルターの柔軟性が向上しました.

  • 背景: 以前は,論理削除やテナントIDによる絞り込みなど,複数の関心事があってもクエリフィルターは1つしか設定できませんでした.
  • 新機能(.NET 10):
    • 複数のクエリフィルターを設定できるようになりました.
    • フィルターに名前を付けることが可能になり,特定のフィルターのみを一時的に外すといった制御ができるようになりました.

7. その他の改善点

  • SQL パラメーターの可読性: SQL のパフォーマンスチューニングの際などに利用されるログ出力において,SQL パラメーターに分かりやすい名前(例:@city)が付与されるようになり,可読性が向上しました.
  • Split Query の順序一貫性の修正: Split Query(クエリ分割)機能において,親子関係のデータ取得時にサブクエリに主キーによる ORDER BY が自動的に付与されるようになり,データ順序の一貫性が保たれるようになりました(これは以前のバージョンのバグ修正に相当します).これは,大量データ取得時に発生するカルテシアン爆発を防ぐ分割クエリの信頼性を高めるものです.
  • Cosmos DB 関連のアップデート: Cosmos DB 周りのアップデートも提供されています.

これらのアップデートは,特にデータベースのクエリパフォーマンス,JSON データの扱いやすさ,およびコーディングのしやすさといった側面において,EF Core の実用性を高めるものとなっています.

最後に

詳細はこちらで!
https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-10.0/whatsnew

Discussion