比方說,我有一個名爲vw_Project
的EF類,其中包含屬性字符串ProjectTitle
以及其他屬性。我想運行一個高效的LINQ查詢,它只查詢結果中第一條記錄的第一列(第一個「單元格」,類似於SqlCommand.ExecuteScalar
)。我可能會寫這樣的事:實體框架 - 在查詢單個列時,如何區分沒有結果和NULL值的結果?
string projectTitle = context.vw_Projects
.Where(p => p.ProjectID == projID)
.Select(p => p.ProjectTitle)
.FirstOrDefault();
的問題是,我不能告訴我查詢是否有任何結果,或者如果它只是一個得到的結果與該varchar
列的NULL
值。
我總是可以查詢整個對象來做出決定,然後將ProjectTitle
列提取到內存中的字符串變量中,但是我會查詢一堆我不需要的列,這是一個糟糕的解決方案。這看起來像這樣:
string projectTitle;
vw_Project project = context.vw_Projects
.Where(p => p.ProjectID == projID)
.FirstOrDefault();
if (project != null)
{
projectTitle = project.ProjectTitle;
}
else
{
throw new Exception("Invalid Project ID");
}
如何在不查詢其他列或行的情況下做出此決定?
我不認爲底部的解決方案是「窮人」:除非您急切地在'Project'上加載集合,否則開銷將很難被檢測到。你應該結合'Where'和'FirstOrDefault',即'FirstOrDefault(p => p.ProjectID == projID)'。 – dasblinkenlight
@dasblinkenlight'FirstOrDefault'的好建議 - 我會相應地更新我的答案。至於另一個建議從數據庫中獲取整個對象的解決方案,你是對的,在大多數情況下它不會產生巨大的影響。但是,如果它是一個大型表格,尤其是一個具有計算列的表格,或者如果您需要獲取多行而不是一個,那麼這是一個不應該被遺忘的重要優化。 –