IEnumerable
定数コレクション
別の JOIN ステートメントの SELECT ステートメント内で LINQ JOIN 句を使用すると、「API.Models.PersonProtocol 型の定数値を作成できません。このコンテキストではプリミティブ型または列挙型のみがサポートされています。」というエラーが発生します。このエラーは、IEnumerable
CollectionppCombined
をデータベース コンテキストで定数値として使用できないために発生します。
提供されたコード内:
<code class="language-csharp">var persons = db.Favorites .Where(x => x.userId == userId) .Join(db.Person, x => x.personId, y => y.personId, (x, y) => new PersonDTO { personId = y.personId, addressId = y.addressId, favoriteId = x.favoriteId, personProtocol = (ICollection<PersonProtocol>) ppCombined .Where(a => a.personId == x.personId) .Select( b => new PersonProtocol() { personProtocolId = b.personProtocolId, activateDt = b.activateDt, personId = b.personId }) });</code>
このコードは、db.Favorites
テーブルと db.Person
テーブルのデータを連結し、その結果を PersonDTO
オブジェクトに投影しようとします。 PersonDTO
オブジェクト内には、personProtocol
コレクションに対する LINQ クエリの結果に設定される ppCombined
プロパティがあります。
問題は、データベースコンテキストで ppCombined
を定数値として使用しようとすることです。 ppCombined
は、データベース テーブルではなく、メモリ内に構築された IEnumerable
オブジェクトです。 LINQ クエリを実行すると、personProtocol
プロジェクションを SQL ステートメントに変換しようとします。ただし、ppCombined
はデータベース テーブルまたはプリミティブ型ではないため、これを行うことはできません。
解決策
このエラーを解決するには、データベースから他の属性を取得した後、メモリ内の ppCombined
内のフィルタリングされた項目をフェッチします。以下は変更されたコードです:
<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 // 匿名对象 { personId = p.personId, addressId = p.addressId, favoriteId = f.favoriteId, }) .AsEnumerable() // 数据库查询在此结束,其余部分是在内存中进行的查询 .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
コレクションをフィルターし、リストに変換します。
データベース クエリをメモリ内処理から分離することで、メモリ内のコレクションをデータベース コンテキストに渡す問題を回避し、バグを解決します。
以上がIEnumerable 定数コレクションを使用した LINQ JOIN の「定数値を作成できません」エラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。