[英]How to determine whether to use join in linq to sql?
我只是想知道我們如何確定是否在linq to sql
使用join
linq to sql
。
例如。 如果我們有這樣的兩個表,那就說吧
Table 1 Customer
id
name
Table 2 addresstype
id
address1
customerid
和
var address = from cu in Customer
from ad in addresstype
where cu.id == ad.customerid
select ad;
要么
var address = from cu in Customer
join ad in addresstype on cu.id equals ad.customerid
select de;
兩種方式都是一樣的。 性能有什么不同嗎?
第二種方法,如果沒有任何匹配,會出現錯誤嗎?
你是使用linq實體還是linq到SQL? 如果是前者,那么您可以通過在模型中定義關系並使用導航屬性來避免這兩種情況。 這將是最清晰的做事方式
基本上,這兩個LINQ查詢等同於以下SQL查詢:
select ad.*
from Customer cu, AddressType ad
where cu.ID == ad.CustomerID -- I assume this was meant by the OP
和
select ad.*
from Customer cu
inner join AddressType ad on cu.id = ad.CustomerID;
這兩個查詢之間的區別主要是語義,因為數據庫在兩種情況下都會做同樣的事情,並為兩個查詢返回相同的結果集。
我更喜歡SQL和LINQ中的join
語法,因為它定義了兩個表/實體之間的顯式關系,這只是在無連接版本中隱含的。
這些似乎是相同的查詢,他們返回相同的結果,但我不知道哪一個可以更快,它應該是替補標記。
但是,在linq2sql
的情況下,我更喜歡相關子查詢而不是連接,因為目前如果你想檢查方程式的兩個元素,你應該使用以下語法:
new {X,Y} equals new {X',Y'}
在連接中,如果你有超過這個方程式,你應該將它轉換為嵌套查詢。 因此,我希望有一個更易讀的代碼,它使用差異操作的最小差異。
要將第三個更優先的方法放入LINQ to SQL的混合中,請使用表之間的關聯(即使您沒有在數據庫中設置它們)。 有了這些,您可以導航對象圖而不是使用連接:
var query = from cu in Customer
from ad in cu.Addresses
select ad;
注意:在查詢對象圖時,LINQ to SQL將連接轉換為左外連接,其中 - 作為join / where語法默認為內連接。
當對象之間沒有自然關系時,應該使用LINQ中的連接。 例如,如果要查看與客戶位於同一城市的商店列表,請使用聯接。 (使用Store.Address.City加入Customer.Address.City)。
這兩個查詢之間應該沒有區別。 幾個月前我自己真的想知道這個問題。 我通過LINQPad驗證了這一點。 它是一個免費工具,您可以下載並實際查看生成的任何LINQ查詢的SQL(這是發送到數據庫的查詢)。
對於這兩個查詢,生成的SQL應該相同。
如果您是通過Visual Studio執行此操作,還可以通過一種方式查看生成的SQL。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.