2015-05-17 30 views
0

我在今天練習時,當我意識到有兩種方法可以從數據庫中檢索數據時,我創建了兩個數據網格,並使用兩種不同的方式來填充每個這些數據網格他們產生了相同的結果。是否有必要在Linq中使用連接到SQL

第一種方法是使用joins從相關表中獲取數據,其他方法是使用linq查詢來訪問相關表。代碼如下所示:

NorthWindDataContext dbContext = new NorthWindDataContext(); 

     var orders = from ord in dbContext.Orders 
        select new { ord.ShipCountry , ord.Customer.ContactName}; 

     var orders2 = from ord in dbContext.Orders 
        join cust in dbContext.Customers on ord.CustomerID equals cust.CustomerID 
        select new 
        { 
         ord.ShipCountry, cust.ContactName 
        }; 
     var data = orders2; 

     DataGrid.ItemsSource= orders; 
     DataGrid2.ItemsSource = orders2; 

我之類的標題問題是,如果是完全必要使用joins,因爲我覺得他們真的很麻煩,有時使用。

+0

如果這是一個新項目,你不應該使用Linq To SQL時期。改爲使用實體框架。 – Aron

回答

1

您需要使用能夠讓您從訂單到客戶的東西。

Join可以做到這一點。這是第二個查詢的工作方式。

order知道customer可以做到這一點。這是第一個查詢的工作原理。

如果您的數據提供者瞭解ordercustomer之間的連接,那麼這些聯繫都將通過相同的方式。

如果您的數據提供者是不知道的連接,然後在第一個例子中的做法將導致N + 1個UPS的樣子,而不是1

一個LINQ友好的ORM一般會知道這些連接只要存在適當的關係標記屬性(就像Linq2SQL,EF,NHibernate等不同)。

對於供應商不瞭解關係的情況,或者您有理由加入非外鍵關係的情況,瞭解join方法仍然很重要。

0

答案是「sort of」。由於您使用的是ORM,例如Linq-to-Sql,因此您不需要直接在您的linq查詢中調用join來完成您正在嘗試執行的操作。

但是,當ORM激活查詢時,它將生成實際的SQL代碼,其中會包含一個連接語句以獲取您查詢的結果。由於您使用的是ORM,因此返回的數據映射到對象,並且由於Customer具有對象之間的關係,因此該關係也將從數據庫INTO對象中轉換。

ord.Customer.ContactName 

上面的語句是最有可能轉換爲執行訂單的客戶INNER JOIN之間&一個JOIN語句。

因此,您的兩個LINQ查詢很可能會生成類似的SQL查詢。兩者都有一個JOIN語句。因爲你的對象之間的關係也存在於數據庫中(並且所有東西都被映射在一起顯示出這種關係),所以你不需要直接在LINQ語句中使用連接。