クエリ中の例外: 「API.Models.PersonProtocol 型の定数値を作成できません。このコンテキストではプリミティブ型または列挙型のみがサポートされています。」
根本原因具体的な問題は、ppCombined コレクションがメモリ内のデータを表す一方で、クエリがデータベース内のデータに対して実行されることです。 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 // 匿名对象 { 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 コレクションをフィルター処理してメモリに投影できるようになります。 AsEnumerable()
以上がSELECT 句で非プリミティブ型を使用して結合すると LINQ クエリが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。