我有這個代碼:
var myAddress = employeeEntity.Organization.OrganizationAddress
.FirstOrDefault(a => a.Address.AddressTypeId).Equals(addressType)
在某些情況下,與 OrganizationAddress 相關的地址物體可以為空,這句話給了我一個錯誤,即使地址物體為空,我該怎么辦?如果地址為空,有什么方法會帶來空而不是錯誤?
OrganizationAddress 是一個串列,因為可以有許多不同型別的地址
uj5u.com熱心網友回復:
我找到了解決方案,我不知道我可以將地址指定為可為空的。
var myAddress = employeeEntity.Organization.OrganizationAddress
.FirstOrDefault(a => (bool)(a.Address?.AddressTypeId).Equals(addressType)).Equals(true));
uj5u.com熱心網友回復:
一種有點奇怪的方法...首先不建議使用FirstOrDefaultno OrderBy,因為如果您有多個組織地址,則無法保證結果可重復。
總體而言,如果您想查看此組織地址(串列?)是否包含與您可以使用的 AddressType 匹配的地址
var isMyAddress = employeeEntity.Organization.OrganizationAddress
.Any(a => a.Address != null
&& a.Address.AddressTypeId == addressType);
如果您的檢查更多的是要查看第一個組織地址是否是該型別,那么應該有一個OrderBy子句來確定哪個 OrganizationAddress 是第一個。這可能類似于 CreatedDate 或 SortOrder 來識別哪個先出現:
var isMyAddress = employeeEntity.Organization.OrganizationAddress
.OrderBy(oa => oa.CreatedDateTime)
.FirstOrdefault(a => a.Address?.AddressTypeId) == addressType;
這是在處理已經加載到記憶體中的物體時。我在您的方法中看到的問題是,在禁用延遲加載的情況下,Address 可能為空,例如您的導航屬性未宣告為virtual或支持無代理延遲加載。您找到的解決方案解決了如何處理地址可能為空的情況。我會仔細研究一下,因為我懷疑在該資料結構中,OrgainzationAddress 中的地址(看起來是多對多連接) table) 永遠不應為 Null。
如果啟用了延遲加載并且地址不是預先加載而是被訪問并且資料庫中存在匹配的行,則 EF 將執行查詢來檢索它。這會帶來性能成本(訪問屬性時需要多次往返資料庫),但僅在實際需要時才加載資料。如果您沒有啟用延遲加載,則上述代碼 100% 依賴于 a) 您記得在呼叫此代碼之前將 OrganizationAddress 和相關地址預先加載到您的員工物體中:
var employeeEnitity = _dbContext.Employees
.Include(e => e.Orgainzation)
.ThenInclude(o => o.OrganizationAddress)
.ThenInclude(oa => oa.Address)
.Where(e => e.EmployeeId == employeeId)
.Single();
...或b)您依賴于EF在您閱讀Employee時可能已經在跟蹤相關物體的可能性。這是危險的,因為它在運行時完全是主觀的,并且可能導致奇怪的間歇性行為,其中一些呼叫似乎加載了地址,而其他時候即使有一個地址明確存在于資料庫中,也沒有加載地址。當您不急切加載且未啟用延遲加載時,然后獲取頂級物體,EF 仍會從其當前跟蹤的物體池中填充相關物體。這通常會導致物體圖的圖片不完整,并且會根據 DbContext 可能恰好跟蹤的相關物體的數量而有所不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/456799.html
標籤:实体框架
