2011-03-30 76 views
1

我幾個月來一直在使用linq與實體框架結合,並且想知道子查詢和連接。聯接linq中的子查詢?

我使用子查詢這樣的很多:

(from department in 
     (from hospital in hospitalRepository.Hospitals 
     where hospital.Id == viewModel.DestinationHospitalId 
     select hospital.Departments).Single() 
select new { Value = department.Id, Text = department.Name }).ToList(); 

我從來沒有真正使用加入關鍵字,因爲對我來說,感覺有點太databasey。我認爲要進行連接,我需要在我的域對象中使用外鍵,我不太喜歡這些外鍵,而且我覺得子查詢更直觀。然而,我幾乎總是看到人們在linq中使用連接,這讓我懷疑連接是否更好,或者人們習慣使用SQL中的連接。

此外,我遇到了一個問題,我的子查詢,當Hospitals ObjectSet不包含我想要的ID醫院。我不知道如何使子查詢返回一個空集合。顯然,列表的默認值是null。現在我使用Single並捕獲異常,但是我希望我的查詢只返回一個空列表。

我應該剛開始使用連接嗎?我不應該讓我的查詢返回一個空列表並將該情況作爲異常處理嗎?如果列表的默認設置是空的,會更好嗎?

一些背景:此查詢的目的是基於另一個下拉列表的選定值在我的視圖中填充下拉框。另一個下拉列表可能沒有選擇,這將需要第一個下拉列表爲空。所以它不是確實是的一個例外。

在此先感謝。

回答

3

我會絕對如果我是你,開始擁抱連接。從根本上說,如果你有兩個集合,並且想要根據某個ID來查找相應的行,那麼這正是一個連接的用途。不要從數據庫角度考慮它 - 從匹配角度考慮它。

我不是很確定你需要它在這種情況下,你要知道...我懷疑你會罰款:

from hospital in hospitalRepository.Hospitals 
where hospital.Id == viewModel.DestinationHospitalId 
from department in hospital.Departments 
select new { Value = department.Id, Text = department.Name } 

在這裏,如果沒有匹配的結果,你會最終得到一個空的列表,以便爲您解決問題。不過,你也應該瞭解一些替代品來Single的其他情形:

  • First
  • FirstOrDefault
  • SingleOrDefault
+0

您好,感謝答案。我不知道我可以在linq中做到這一點,這看起來實際上和我想要做的以及我試圖用子查詢模擬的一樣。這是否被視爲linq中的連接?因爲我認爲它更像是一個SQL連接,你可以將兩組笛卡爾積轉換爲一些字段。此外,我知道Single的替代方案。無論如何,我正在儘快重寫我的查詢。 – 2011-03-30 08:00:01

+0

@Matthijs:如果您意識到Single的替代方案,則應該使用它們而不是捕獲Single引發的異常。看看上面的查詢生成的SQL - 我確定它會*使用連接,但是這是由於使用了'hospital.Departments',它已經隱式連接了。 – 2011-03-30 08:56:20

+0

@Jon:在我的查詢中,當我使用SingleOrDefault時,我會得到一個NullArgumentException(或類似的東西),因爲「來自(null)..」中的部門。這就是爲什麼我使用Single併發布了這個問題(我的子查詢似乎不再是預期的方式了)。然後關於加入,我想知道術語join in linq。你建議我開始更多地使用連接,所以我想確保你的答案中的查詢是你的意思,並且不一定如'從X中的X連接到Y中的連接... ..'。這就是我主要看到人們在談論linq連接時所做的事情,我不想使用它。 – 2011-03-30 09:21:14