我有这个查询,谓词是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,因为我需要对该数据进行一些数据操作。所以我有另外一个查询
query.Select(x => new BasePropertyDTO() {
Id = x.Id,
StreetNumber = x.Info.Address.StreetNumber,
Street = x.Info.Address.StreetName,
});
然而,它会引发异常
必须是可简化的节点
我的解决方法是在ToList()
之前执行Select()
并且不再抛出异常,但现在我抓取了我不需要的数据。
我发现当我尝试从Info导航属性或任何导航属性投影我的select属性时,问题就出现了,即使我有Include()
个调用。
关于为什么这样做或者我的查询有什么问题的任何想法?
升级到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部分抛出
已添加具有相同键的项目
如果我删除它,我仍然得到
必须是可简化的节点
答案 0 :(得分:1)
EF团队已在Entity Framework Core 1.1上解决了此问题。因此,您必须使用该版本来避免上述问题。
Git Issue 已在上述版本中解决: