2010-06-03 6 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. 구문에 대한 조인 사용의 차이점은 무엇입니까? where where where 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; 

는 차이가 있습니다 가입 어디 절, 그들이 사용하는 방법에 따라. 어느 쪽이든 LINQ-to-SQL은 해시 크로스 조인이 아닌 내부 조인을 생성하고 where 절을 기반으로 필터링하므로 조인을 사용하는 것이 좋습니다.

괄호가 필요하지 않습니다. 어떤 경우에는 가독성을 높이기 때문에 포함시킬 수 있습니다.

+0

감사합니다. 하지만 명시 적 조인없이이 작업을 수행 할 수 있습니까? 이것을 위해 selectmany를 사용하는 예제를 제공 할 수 있습니까? –

+0

"LINQ-to-SQL은 해시 조인이 아닌 내부 조인을 생성합니다."응? 그릇된. Linq는 SQL 해시 조인을 생성하지 않습니다 ... 그것은 SQL을 생성합니다. 쿼리 최적화 프로그램은 사용자의 입력없이 통계를 기반으로 해시 조인을 생성합니다. –

+0

@ David B - 죄송합니다 ... 나쁜 용어입니다. 교차 가입은 어떻습니까? 'u, *와 같은 usertype에서 u를 선택하고 t로 입력하십시오. '와 동일합니다. –

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

감사합니다. 조인 기준을 잊어 버렸습니다. –

+0

Np. 그것이 "가입"이 선호되는 주요 이유입니다. 제작할 때 조인 기준을 잊어 버리는 것은 불가능하며 조인 기준과 필터링 기준을 쉽게 식별 할 수 있습니다. –