實體框架選擇IQueryable拋出“必須是可簡化的節點”

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,
});

但是,它引發了一個例外

必須是可簡化的節點

我的解決方法是在Select() ToList()之前執行ToList()並且不再拋出異常,但現在我正在抓取我不需要的數據。

我發現問題出現在我嘗試從Info導航屬性或任何導航屬性投影我的選擇屬性時,即使我有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部分拋出

已添加具有相同鍵的項目

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

必須是可簡化的節點

熱門答案

EF團隊已在Entity Framework Core 1.1上解決了這個問題。因此,您必須使用該版本來避免上述問題。

實體框架核心1.1

在上述版本中解決的Git問題

在通過連接聚合時,“必須是可簡化節點”



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因