实体框架选择IQueryable投掷"必须是可简化的节点"

时间:2016-11-21 23:02:03

标签: c# entity-framework entity-framework-core navigation-properties

我有这个查询,谓词是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部分抛出

  

已添加具有相同键的项目

如果我删除它,我仍然得到

  

必须是可简化的节点

1 个答案:

答案 0 :(得分:1)

EF团队已在Entity Framework Core 1.1上解决了此问题。因此,您必须使用该版本来避免上述问题。

Entity Framework Core 1.1

Git Issue 已在上述版本中解决:

'must be reducible node' when aggregating over a join