재우니의 블로그


http://www.dotnettricks.com/learn/linq/linq-inner-join-with-and-and-or-conditionLINQ에는 SQL JOIN과 같은 동작 및 구문을 제공하는 JOIN 쿼리 연산자가 있습니다. 알다시피, Inner join은 두 테이블 모두와 일치하거나 존재하는 레코드 또는 행만 반환합니다. 간단한 내부 조인 예제는 다음과 같습니다.

  1.  

DataContext context = new DataContext();

var q = (from pd in context.Products

join od in context.Orders on pd.ProductID equals od.ProductID

orderby od.OrderID

select new

{

od.OrderID,

pd.ProductID,

pd.Name,

pd.UnitPrice,

od.Quantity,

od.Price,

}).ToList();

 

AND 조건의 내부 조인

 

때로는 내부 조인을 적용하고 조건을 적용해야합니다. 내부 조인과 조건에 대한 쿼리를 작성하려면 new 키워드를 사용하여 두 개의 익명 형식 (왼쪽 테이블과 오른쪽 테이블에 하나씩)을 만들고 아래에 표시된 것처럼 익명 형식을 비교해야합니다.

  1.  

DataContext context = new DataContext();

var q=from cust in context.tblCustomer

join ord in context.tblOrder

// Both anonymous types should have exact same number of properties having same name and datatype

on new {a=(int?)cust.CustID, cust.ContactNo} equals new {a=ord.CustomerID, ord.ContactNo}

select new

{

cust.Name,

cust.Address,

ord.OrderID,

ord.Quantity

};

// Generated SQL

SELECT [t0].[Name], [t0].[Address], [t1].[OrderID], [t1].[Quantity]

FROM [tblCustomer] AS [t0]

INNER JOIN [tblOrder] AS [t1] ON (([t0].[CustID]) = [t1].[CustomerID]) AND ([t0].[ContactNo] = [t1].[ContactNo])

 

노트

  1. 항상 익명 형식 모두 동일한 이름과 데이터 형식을 가진 동일한 수의 속성을 가져야합니다. 그렇지 않으면 컴파일 타임 오류가 발생합니다. "조인 호출에서 형식 유추가 실패했습니다."

  2. 비교 필드는 모두 NULL 또는 NOT NULL 값을 정의해야합니다.

  3. 그들 중 하나가 NULL로 정의되고 다른 하나가 NOT NULL로 정의되면, 위와 같이 NULL 데이터 타입으로 NOT NULL 필드의 타입 캐스팅을 수행해야합니다

 

OR 조건이있는 내부 조인

 

경우에 따라 내부 조인을 적용하거나 조건을 적용해야 할 때가 있습니다. 조건을 가진 내부 조인에 대한 쿼리를 작성하려면 || 운영자의 상태는 다음과 같습니다.

  1.  

DataContext context = new DataContext();

var q=from cust in context.tblCustomer

from ord in context.tblOrder

where (cust.CustID==ord.CustomerID || cust.ContactNo==ord.ContactNo)

select new

{

cust.Name,

cust.Address,

ord.OrderID,

ord.Quantity

};

// Generated SQL

SELECT [t0].[Name], [t0].[Address], [t1].[OrderID], [t1].[Quantity]

FROM [tblCustomer] AS [t0], [tblOrder] AS [t1]

WHERE (([t0].[CustID]) = [t1].[CustomerID]) OR ([t0].[ContactNo] = [t1].[ContactNo])