ホームページ > バックエンド開発 > C++ > LINQ クエリが「タイプの定数値を作成できません…」というメッセージで失敗するのはなぜですか?

LINQ クエリが「タイプの定数値を作成できません…」というメッセージで失敗するのはなぜですか?

Linda Hamilton
リリース: 2025-01-17 23:21:11
オリジナル
113 人が閲覧しました

Why Does My LINQ Query Fail with

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート