1. ホーム
  2. c#

[解決済み] 型の定数値を作成できない このコンテキストでは、プリミティブ型または列挙型のみがサポートされています。

2022-04-20 22:07:06

質問

以下のクエリで、このエラーが発生します。

型の定数値を作成できません。 API.Models.PersonProtocol . このコンテキストでは、プリミティブ型または列挙型のみがサポートされています。

ppCombined 以下は IEnumerable オブジェクトの PersonProtocolType を2つ連結したものです。 PersonProtocol のリストです。

なぜこれが失敗するのでしょうか?LINQを使うことはできないのでしょうか? JOIN の中にある SELECTJOIN ?

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
                 })
        });

解決方法は?

これは、以下の理由でうまくいきません。 ppCombined はメモリ上のオブジェクトの集合であり、データベース上のデータセットとメモリ上にある別のデータセットを結合することはできません。代わりに、フィルタリングされた項目を抽出することができます。 personProtocolppCombined メモリ内のコレクション は、データベースから他のプロパティを取得しました。

var persons = db.Favorites
    .Where(f => f.userId == userId)
    .Join(db.Person, f => f.personId, p => p.personId, (f, p) =>
        new // anonymous object
        {
            personId = p.personId,
            addressId = p.addressId,   
            favoriteId = f.favoriteId,
        })
    .AsEnumerable() // database query ends here, the rest is a query in memory
    .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()
        });