2012-07-31 62 views
6

什麼寫聯接使用2個from子句之間和where這樣的區別:使用LINQ到SQL與多個連接FROM子句語法與傳統的連接語法

var SomeQuery = from a in MyDC.Table1 
       from b in MyDC.Table2 
       where a.SomeCol1 == SomeParameter && a.SomeCol2 === b.SomeCol1 

續寫join聯接運營商。

這是一個join 2表,但當然,有時候,我們需要加入更多的表,我們需要的,如果我們選擇上述語法中的其他條款fromwhere結合。

我知道這兩個語法查詢返回相同的數據,但我不知道是否有性能差異,或另一種差別的,這將有利於得出結論在另一種語法。

感謝您的建議。

回答

9

這個問題其實在這兩個答案中很不錯。

INNER JOIN ON vs WHERE clause

INNER JOIN vs multiple table names in "FROM"

我將在三個不同的LINQ表達式將如何轉換成SQL兩個例子。

隱式連接:

from prod in Articles 
from kat in MainGroups 
where kat.MainGroupNo == prod.MainGroupNo 
select new { kat.Name, prod.ArticleNo } 

將被翻譯成

SELECT [t1].[Name], [t0].[ArticleNo] 
FROM [dbo].[Article] AS [t0], [dbo].[MainGroup] AS [t1] 
WHERE [t1].[MainGroupNo] = [t0].[MainGroupNo] 

內連接:

from prod in Articles 
join kat in MainGroups on prod.MainGroupNo equals kat.MainGroupNo 
select new { kat.Name, prod.ArticleNo } 

將被翻譯成

SELECT [t1].[Name], [t0].[ArticleNo] 
FROM [dbo].[Article] AS [t0] 
INNER JOIN [dbo].[MainGroup] AS [t1] ON [t0].[MainGroupNo] = [t1].[MainGroupNo] 

LEFT OUTER JOIN:如果你想測試你的表情會如何轉換成SQL

from prod in Articles 
join g1 in MainGroups on prod.MainGroupNo equals g1.MainGroupNo into prodGroup 
from kat in prodGroup.DefaultIfEmpty() 
select new { kat.Name, prod.ArticleNo } 

將被翻譯成

SELECT [t1].[Name] AS [Name], [t0].[ArticleNo] 
FROM [dbo].[Article] AS [t0] 
LEFT OUTER JOIN [dbo].[MainGroup] AS [t1] ON [t0].[MainGroupNo] = [t1].[MainGroupNo] 

,我建議您嘗試LINQPad 。這是一個很好的工具來搞清楚這種東西。

+0

那麼,有什麼好? 2個或更多從條款或2個或更多的連接條款? – frenchie 2012-07-31 23:35:57

+0

根據http://stackoverflow.com/questions/894490/sql-left-join-vs-multiple-tables-on-from-line加入條款似乎更可取。 – 2012-07-31 23:40:29

-2
var result = from a in DB.classA 
from b in DB.classB 
where a.id.Equals(b.id) 
select new{a.b};