2010-06-03 116 views
1

我下面的表結構Linq-to-sql加入/在哪裏?

用戶 ID

類型 ID isBool

UsersTypes 用戶ID 類型

我要選擇基於ID和isBool所有UserTypes 。

我嘗試這個查詢

var q = from usertype in usertypes 
     from type in types 
     where type.isBool == false 
     where userstypes.user == id 
     select usertype; 

但如預期並沒有工作。我的問題是:

  1. 爲什麼?
  2. 在使用語法上的連接有沒有什麼區別vs哪裏,哪裏vs哪裏cond1 & & cond2?我的理解是查詢優化器將優化。
  3. 使用哪裏cond1 == var1 & & cond2 == var2有和沒有括號有什麼區別嗎?這似乎有點奇怪,有可能沒有括號來構建它
  4. 在這種情況下我需要什麼類型的查詢?我可以看到,我可以做一個子查詢或使用一個組,但不是100%確定是否需要。一個例子可能會有所幫助。我想在這種情況下可能需要子查詢。

回答

4

您的查詢沒有加入這兩個表上的任何公共字段:

var q = from u in usertypes 
     join t in types on u.typeid equals t.id 
     where t.isBool == false && usertypes.user == id 
     select u; 

有差異連接和where子句,取決於如何使用它們。無論哪種方式,使用連接是首選,因爲LINQ到SQL將生成一個內部連接,而不是一個 散列 交叉連接(然後基於where子句進行篩選)。

你不需要括號。你可以包含它們,因爲它們在某些情況下確實有助於可讀性。

+0

謝謝。但是如果沒有顯式連接,可以做到這一點嗎?你能否提供使用selectmany的例子呢? – 2010-06-03 19:13:41

+0

「LINQ-to-SQL將生成內部連接而不是哈希連接」咦?假。 Linq to sql不會生成散列連接...它會生成sql。查詢優化器根據統計信息生成散列連接,而無需輸入。 – 2010-06-03 19:22:30

+0

@大衛B - 對不起......壞的術語。交叉連接如何?相當於從usertype中選擇u作爲u,鍵入t' – 2010-06-03 19:43:05

1
var q = from usertype in usertypes 
     from type in types 
     where type.isBool == false 
     where usertype.user == id 
     where usertype.typeid = type.id //join criteria 
     select usertype; 
+0

謝謝。我看到忘記了加入標準。 – 2010-06-03 19:24:15

+0

Np。這是首選「加入」的主要原因:創作時不可能忘記加入標準,並且在閱讀時很容易識別加入標準與過濾標準。 – 2010-06-03 19:26:09