述語がExpression<Func<Property, bool>>
で、クエリ全体がIQueryable
返すこのクエリがあります。
var query = _db.PropertyRepository.Get(predicate)
.Include(x => x.Info)
.ThenInclude(x => x.Address)
.Include(x => x.TransactionListingAgents)
.ThenInclude(x => x.Agent)
.ThenInclude(x => x.Person)
.ThenInclude(x => x.Contact)
私はそのデータでいくつかのデータ操作を行う必要があるため、そのIQueryable
をDTOに投影するためにselectを実行したいと思います。だから私はこの他のクエリを持っている
query.Select(x => new BasePropertyDTO() {
Id = x.Id,
StreetNumber = x.Info.Address.StreetNumber,
Street = x.Info.Address.StreetName,
});
ただし、例外をスローします。
還元可能ノードでなければならない
私の回避策は、 Select()
ToList()
前にToList()
を実行していて、もう例外をスローしませんでしたが、今は必要のないデータを取得しています。
私は、 Include()
呼び出しを持っていても、Infoナビゲーションプロパティまたはナビゲーションプロパティから選択プロパティをプロジェクトに投影しようとすると、問題が発生することがわかりました。
これがなぜこのように振る舞っているのか、私の質問に間違いがあるのかについてのアイデアはありますか?
1.1.0にアップグレードした後の完全なクエリ
query.ToList().Select(x => new BasePropertyDTO() {
Id = x.Id,
StreetNumber = (x.Info != null && x.Info.Address != null) ? x.Info.Address.StreetNumber : "",
Street = (x.Info != null && x.Info.Address != null) ? x.Info.Address.StreetName : "",
City = (x.Info != null && x.Info.Address != null) ? x.Info.Address.City : "",
AgentName = x.TransactionListingAgents.Where(t => t.Agent != null && t.Agent.Person != null && t.Agent.Person.Contact != null && t.ListingId == x.Id && t.BrokerageId == x.BrokerageId).Select(a => a.Agent.Person.Contact.FullName).FirstOrDefault()
});
AgentName部分がスローする
同じキーを持つアイテムが既に追加されています
私がそれを取り除くと、私はまだ
還元可能ノードでなければならない
EFチームはEntity Framework Core 1.1でこの問題を修正しました。あなたは上記の問題を避けるためにそのバージョンを使用する必要があります。
上記のバージョンで解決されたGitの問題 :