ホームページ > バックエンド開発 > C++ > IEnumerable 定数コレクションを使用した LINQ JOIN の「定数値を作成できません」エラーを解決する方法

IEnumerable 定数コレクションを使用した LINQ JOIN の「定数値を作成できません」エラーを解決する方法

DDD
リリース: 2025-01-17 23:36:10
オリジナル
385 人が閲覧しました

How to Resolve

IEnumerable定数コレクション

を使用した LINQ 接続

別の JOIN ステートメントの SELECT ステートメント内で LINQ JOIN 句を使用すると、「API.Models.PersonProtocol 型の定数値を作成できません。このコンテキストではプリミティブ型または列挙型のみがサポートされています。」というエラーが発生します。このエラーは、IEnumerableCollectionppCombined をデータベース コンテキストで定数値として使用できないために発生します。

提供されたコード内:

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

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