以下のクエリでこのエラーが発生します
API.Models.PersonProtocol
型の定数値を作成できません。このコンテキストでは、プリミティブ型または列挙型のみがサポートされています
以下のppCombined
は、IEnumerable
のPersonProtocolType
オブジェクトです。これは、2つのPersonProtocol
リストの連結によって構成されています。
なぜこれが失敗するのですか? JOIN
のSELECT
の内側で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
})
});
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()
});
誰かがこれを探しているのかどうかわからない。私は同じ問題を抱えていました。クエリを選択してから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);
これが誰にでも役立つことを願っています。
私の場合は、次のようにして問題を解決できました。
私はこれから私のコードを変更しました:
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();
AsEnumerable()とToList()を追加するだけなので、このようになります。
db.Favorites
.Where(x => x.userId == userId)
.Join(db.Person, x => x.personId, y => y.personId, (x, y).ToList().AsEnumerable()
ToList().AsEnumerable()
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);
}