實體框架 - 在使用之前檢查單個記錄的正確方法

.net c# entity-framework

要獲得記錄列表,我通常會做以下事情:

var efCompany = from a in _dbRiv.Company where a.CompanyId == companyFeedInfo.CompanyId select a;

要獲得單個記錄,當我知道我使用PK來檢索它時,我使用類似的東西:

var efCompany = (from a in _dbRiv.Company where a.CompanyId == companyFeedInfo.CompanyId select a).First();

現在,使用單記錄方法,如果PK是一個錯誤的值(就像它有目的地在測試中),第二行會拋出一個錯誤。

獲得單個記錄並處理它的最佳實踐方法是什麼?

一般承認的答案

如果您期望0或1,請使用SingleOrDefault FirstOrDefault如果您只需要第一個記錄,則使用SingleOrDefault ,但可以應對0.如果沒有結果,兩者將返回該類型的默認值(通常為null)。

順便說一下,這樣的查詢通常更具可讀性(IMO) 而不使用查詢表達式,所以你可能會有類似的東西:

var efCompany = _dbRiv.Company
                      .Where(a => a.CompanyId == companyFeedInfo.CompanyId)
                      .SingleOrDefault();

if (efCompany != null)
{
    // Use it
}
else
{
    // Report to user, or whatever
}

當您使用多個運算符或執行相對複雜的事情(如連接)時,查詢表達式很棒 - 但如果您剛剛獲得了where子句或只是進行了投影,那麼這個“點符號”就更簡單了。當你需要在最後調用類似FirstOrDefault的方法時,它也會更好。


熱門答案

請注意, SingleOrDefault()FirstOrDefault()都不允許您指定默認值。

DefaultIfEmpty() ,它允許您指定在枚舉中沒有項目時返回的默認值。您可以將這個與First() (如在DefaultIfEmpty().First() )組合以實現FirstOrDefault()的行為,並將lambda包裝為創建新實例並將其添加到集合中。

如果您只需要檢查是否存在記錄,也可以使用Any() 。但是,如果您需要處理記錄(如果存在),則會導致兩個查詢。



Related

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