メモリ内データを使用した LINQ クエリの「定数作成エラー」の解決
課題:
LINQ クエリが失敗し、「API.Models.PersonProtocol 型の定数値を作成できません。このコンテキストではプリミティブ型または列挙型のみがサポートされています。」というエラーが生成されました。これは、データベース レコードとメモリ内コレクション (ppCombined
という名前) 間の結合操作中に発生しました。
エラーの理解:
このエラーは、LINQ to Entities (または同様の ORM) がメモリ内コレクションに関係する結合を SQL に直接変換できないために発生します。 データベース内で結合を効率的に実行するには、両方のデータセットがデータベースに常駐する必要があります。
解決策: 2 段階のアプローチ
この解決策には、データベース クエリをメモリ内処理から分離することが含まれます。 まず、データベースから必要なデータを取得し、次に別のメモリ内操作でメモリ内コレクションとの結合を実行します。
<code class="language-csharp">var persons = db.Favorites .Where(f => f.userId == userId) .Join(db.Person, f => f.personId, p => p.personId, (f, p) => new // anonymous object { personId = p.personId, addressId = p.addressId, favoriteId = f.favoriteId, }) .AsEnumerable() // Crucial: This line switches to in-memory processing .Select(x => new PersonDTO { personId = x.personId, addressId = x.addressId, favoriteId = x.favoriteId, personProtocol = ppCombined .Where(p => p.personId == x.personId) .Select(p => new PersonProtocol { personProtocolId = p.personProtocolId, activateDt = p.activateDt, personId = p.personId }) .ToList() });</code>
AsEnumerable()
メソッドが重要です。データベース クエリを強制的に実行し、メモリ内のコレクションを返します。 後続の Select
ステートメントは、このメモリ内データを処理し、アプリケーションのメモリ内で効率的に ppCombined
と結合します。 これにより、データベース コンテキスト内で直接結合を実行しようとする際の制限が回避されます。
以上がインメモリ コレクションに参加する LINQ クエリの「定数値を作成できません」エラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。