LINQ クエリ エラー: 「API.Models.PersonProtocol 型の定数値を作成できません。このコンテキストではプリミティブ型または列挙型のみがサポートされています。」
この記事では、SELECT 句で API.Models.PersonProtocol 型の定数値を作成しようとしたことによって発生する LINQ クエリのエラーを解決します。このコンテキストでは、プリミティブ型または列挙型のみが定数として許可されます。
問題は次のコード行にあります:
<code class="language-csharp">personProtocol = (ICollection<personprotocol>) ppCombined .Where(a => a.personId == x.personId) .Select( b => new PersonProtocol() { personProtocolId = b.personProtocolId, activateDt = b.activateDt, personId = b.personId })</code>
ここで、ppCombined
はメモリ内の PersonProtocolType
オブジェクトのコレクションです。データベースから取得したデータに直接接続することはできません。
解決策
このエラーを解決するには、ppCombined
のフィルタリングおよびマッピング操作を SELECT 句の外に移動する必要があります。以下は変更されたコードです:
<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>
この変更されたクエリでは、最初に ppCombined
コレクションがフィルター処理され、メモリ内にマップされて、必要な PersonProtocol
オブジェクトが取得されます。結果は、PersonDTO
オブジェクトの personProtocol
プロパティに割り当てられます。 ppCombined
の処理を AsEnumerable()
の後に移動することで、データベース クエリでのメモリ内コレクションの使用を回避します。 AsEnumerable()
データベース クエリの結果をメモリ コレクションに変換すると、後続のすべての操作がメモリ内で実行され、元のエラーが解決されます。
以上がLINQ クエリが「タイプの定数値を作成できません…」というメッセージで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。