簡體   English   中英

如何確定是否在linq中使用join到sql?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM