2012-09-28 56 views
2

我有條款與2幾個查詢看起來像這樣:FROM子句重寫LINQ到SQL查詢用2到加入

var TheResult = from a in MyDC.Table1 
       from b in MyDC.Table2 
       where a.SomeCol == b.SomeOtherCol 
       select new MyModel() {....} 

我擔心,這個語法是創建一個笛卡兒連接和我想用join語法重寫它,只有一個from子句。我的問題是:我應該如何確定我應該在from條款中放置哪張表?

謝謝。

編輯:由查詢生成的t-sql以SELECT COALESCE((開頭是那個好/壞的東西?

+0

你擔心它*可能*是做一個交叉產品,或者你知道*它是?否則,上面應該是一個內部連接。 –

+0

我確實擔心它可能會產生交叉連接並導致性能問題。 – frenchie

+0

您可以啓動SQL Server Profiler並精確觀察它正在生成和執行的SQL。 –

回答

0

您可以改寫成這樣的JOIN很容易:

var result = from a in MyDC.Table1 
      join b in MyDC.Table2 on a.SomeCol equals b.SomeOtherCol 
      select new MyModel() { SomeProp = a.SomeCol, SomeProp2 = b.SomeCol } 

或者,如果你想要一個左連接:

var result = from a in MyDC.Table1 
      join b in MyDC.Table2 on a.SomeCol equals b.SomeOtherCol 
      into myGroup 
      from m in myGroup.DefaultIfEmpty() 
      select new MyModel() { SomeProp = a.SomeCol, SomeProp2 = m.SomeCol } 
+0

在您提供的第一個示例代碼中,我還可以將其寫爲「從MyDC.Table2中的a連接到b中的MyDC.Table1中的b.omeCol等於a.SomeOtherCol」它有什麼區別?如果是這樣,我應該如何選擇每張桌子的順序? – frenchie

+0

表格順序對INNER連接無關緊要。你只會得到'b.SomeCol'等於'a.SomeOtherCol'的結果,而且這兩個都不是'null'。 –

+0

你可以看看我的編輯? – frenchie

0

您提供的模型是太多了面向數據和Don」對於理解這個問題如何解決這個問題,有很好的面向對象的感覺。

思考對象,你有什麼將是一個例子:

var TheResult = from u in context.Users 
      from c in MyDC.Countries 
      where u.CountryId == c.Id 
      select new MyModel() { UserName = u.Name, CountryName = c.Name } 

有類似的東西,你可以添加用戶(映射到表1)和國家(之間的關係(你也應該!)映射到表2),所以你可以做:

var country = user.Country; 

這將讓你做一個更直接的查詢,通過LINQ到SQL完全支持(和充分enocouraged):

var TheResult = from u in context.Users 
       select new MyModel() { UserName = u.Name, CountryName = u.Country.Name } 

希望它有幫助。