http://www.dotnettricks.com/learn/linq/linq-inner-join-with-and-and-or-conditionLINQ에는 SQL JOIN과 같은 동작 및 구문을 제공하는 JOIN 쿼리 연산자가 있습니다. 알다시피, Inner join은 두 테이블 모두와 일치하거나 존재하는 레코드 또는 행만 반환합니다. 간단한 내부 조인 예제는 다음과 같습니다.
-
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 키워드를 사용하여 두 개의 익명 형식 (왼쪽 테이블과 오른쪽 테이블에 하나씩)을 만들고 아래에 표시된 것처럼 익명 형식을 비교해야합니다.
-
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])
노트
-
항상 익명 형식 모두 동일한 이름과 데이터 형식을 가진 동일한 수의 속성을 가져야합니다. 그렇지 않으면 컴파일 타임 오류가 발생합니다. "조인 호출에서 형식 유추가 실패했습니다."
-
비교 필드는 모두 NULL 또는 NOT NULL 값을 정의해야합니다.
-
그들 중 하나가 NULL로 정의되고 다른 하나가 NOT NULL로 정의되면, 위와 같이 NULL 데이터 타입으로 NOT NULL 필드의 타입 캐스팅을 수행해야합니다
OR 조건이있는 내부 조인
경우에 따라 내부 조인을 적용하거나 조건을 적용해야 할 때가 있습니다. 조건을 가진 내부 조인에 대한 쿼리를 작성하려면 || 운영자의 상태는 다음과 같습니다.
-
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])