web-dev-qa-db-ja.com

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

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

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

以下のppCombinedは、IEnumerablePersonProtocolTypeオブジェクトです。これは、2つのPersonProtocolリストの連結によって構成されています。

なぜこれが失敗するのですか? JOINSELECTの内側でLINQ JOIN句を使用することはできませんか?

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

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

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()
        });
203
Slauma

誰かがこれを探しているのかどうかわからない。私は同じ問題を抱えていました。クエリを選択してからwhere(またはjoin)を実行し、select変数を使用すると問題は解決しました。 (問題は私のためのコレクション「Reintegraties」にありました)

query.Select(zv => new
            {
                zv,
                rId = zv.this.Reintegraties.FirstOrDefault().Id
            })
            .Where(x => !db.Taken.Any(t => t.HoortBijEntiteitId == x.rId
                                             && t.HoortBijEntiteitType == EntiteitType.Reintegratie
                                             && t.Type == TaakType))
            .Select(x => x.zv);

これが誰にでも役立つことを願っています。

2
Roelant

私の場合は、次のようにして問題を解決できました。

私はこれから私のコードを変更しました:

var r2 = db.Instances.Where(x => x.Player1 == inputViewModel.InstanceList.FirstOrDefault().Player2 && x.Player2 == inputViewModel.InstanceList.FirstOrDefault().Player1).ToList();

これに:

var p1 = inputViewModel.InstanceList.FirstOrDefault().Player1;
var p2 = inputViewModel.InstanceList.FirstOrDefault().Player2;
var r1 = db.Instances.Where(x => x.Player1 == p1 && x.Player2 == p2).ToList();
2
Versatile

AsEnumerable()とToList()を追加するだけなので、このようになります。

db.Favorites
    .Where(x => x.userId == userId)
    .Join(db.Person, x => x.personId, y => y.personId, (x, y).ToList().AsEnumerable()

ToList().AsEnumerable()
0
khaled saleh

OPのコードサンプルではそうでないことを証明するのに十分なコンテキストが提供されないため、追加する価値がありますが、次のコードでもこのエラーが発生しました。

public RetailSale GetByRefersToRetailSaleId(Int32 refersToRetailSaleId)
{
    return GetQueryable()
        .FirstOrDefault(x => x.RefersToRetailSaleId.Equals(refersToRetailSaleId));
}

どうやら、私はInt32とプリミティブintを比較するのにこの文脈でInt32.Equalsを使うことはできません。私は(安全に)これに変更しなければなりませんでした:

public RetailSale GetByRefersToRetailSaleId(Int32 refersToRetailSaleId)
{
    return GetQueryable()
      .FirstOrDefault(x => x.RefersToRetailSaleId == refersToRetailSaleId);
}
0
James Perih