반응형
Link-to-Sql: 여러 왼쪽 외부 결합
LINQ to SQL을 사용하여 왼쪽 외부 결합을 여러 개 사용하는 방법을 찾는 데 문제가 있습니다.좌측 아우터 조인트의 사용법은 잘 알고 있습니다.VB를 쓰고 있어요.NET. 다음은 SQL 구문입니다.
T-SQL
SELECT
o.OrderNumber,
v.VendorName,
s.StatusName
FROM
Orders o
LEFT OUTER JOIN Vendors v ON
v.Id = o.VendorId
LEFT OUTER JOIN Status s ON
s.Id = o.StatusId
WHERE
o.OrderNumber >= 100000 AND
o.OrderNumber <= 200000
이것이 더 깔끔할 수 있습니다(모든 문장이 필요한 것은 아닙니다).
var query =
from order in dc.Orders
from vendor
in dc.Vendors
.Where(v => v.Id == order.VendorId)
.DefaultIfEmpty()
from status
in dc.Status
.Where(s => s.Id == order.StatusId)
.DefaultIfEmpty()
select new { Order = order, Vendor = vendor, Status = status }
//Vendor and Status properties will be null if the left join is null
여기 또 다른 왼쪽 결합 예가 있습니다.
var results =
from expense in expenseDataContext.ExpenseDtos
where expense.Id == expenseId //some expense id that was passed in
from category
// left join on categories table if exists
in expenseDataContext.CategoryDtos
.Where(c => c.Id == expense.CategoryId)
.DefaultIfEmpty()
// left join on expense type table if exists
from expenseType
in expenseDataContext.ExpenseTypeDtos
.Where(e => e.Id == expense.ExpenseTypeId)
.DefaultIfEmpty()
// left join on currency table if exists
from currency
in expenseDataContext.CurrencyDtos
.Where(c => c.CurrencyID == expense.FKCurrencyID)
.DefaultIfEmpty()
select new
{
Expense = expense,
// category will be null if join doesn't exist
Category = category,
// expensetype will be null if join doesn't exist
ExpenseType = expenseType,
// currency will be null if join doesn't exist
Currency = currency
}
Visual Studio(Mac에서 사용 중)에 액세스할 수 없지만 http://bhaidar.net/cs/archive/2007/08/01/left-outer-join-in-linq-to-sql.aspx의 정보를 사용하면 다음과 같은 작업을 수행할 수 있습니다.
var query = from o in dc.Orders
join v in dc.Vendors on o.VendorId equals v.Id into ov
from x in ov.DefaultIfEmpty()
join s in dc.Status on o.StatusId equals s.Id into os
from y in os.DefaultIfEmpty()
select new { o.OrderNumber, x.VendorName, y.StatusName }
VB에서 여러 개의 좌측 아우터 조인 사용법을 알아냈습니다.SQL에 LINQ를 사용하는 NET:
Dim db As New ContractDataContext()
Dim query = From o In db.Orders _
Group Join v In db.Vendors _
On v.VendorNumber Equals o.VendorNumber _
Into ov = Group _
From x In ov.DefaultIfEmpty() _
Group Join s In db.Status _
On s.Id Equals o.StatusId Into os = Group _
From y In os.DefaultIfEmpty() _
Where o.OrderNumber >= 100000 And o.OrderNumber <= 200000 _
Select Vendor_Name = x.Name, _
Order_Number = o.OrderNumber, _
Status_Name = y.StatusName
기능을 사용하는 VB.NET에서는
Dim query = From order In dc.Orders
From vendor In
dc.Vendors.Where(Function(v) v.Id = order.VendorId).DefaultIfEmpty()
From status In
dc.Status.Where(Function(s) s.Id = order.StatusId).DefaultIfEmpty()
Select Order = order, Vendor = vendor, Status = status
당신은 이 투고에 사용된 방법을 따를 수 있어야 한다고 생각합니다.정말 못생긴 것 같지만, 두 번 하면 원하는 결과를 얻을 수 있을 것 같아요.
이게 실제로 당신이 사용하는 것이 더 나은 경우인지 궁금합니다.DataContext.ExecuteCommand(...)
linq로 변환하지 않습니다.
이 linq 쿼리를 응용 프로그램에 사용하고 있습니다.이것이 당신의 요구와 일치한다면 당신은 이것을 참조할 수 있습니다.여기 테이블 3개를 가지고 (좌측 아우터 조인)에 합류했습니다.
Dim result = (From csL In contractEntity.CSLogin.Where(Function(cs) cs.Login = login AndAlso cs.Password = password).DefaultIfEmpty
From usrT In contractEntity.UserType.Where(Function(uTyp) uTyp.UserTypeID = csL.UserTyp).DefaultIfEmpty ' <== makes join left join
From kunD In contractEntity.EmployeeMaster.Where(Function(kunDat) kunDat.CSLoginID = csL.CSLoginID).DefaultIfEmpty
Select New With {
.CSLoginID = csL.CSLoginID,
.UserType = csL.UserTyp}).ToList()
언급URL : https://stackoverflow.com/questions/267488/linq-to-sql-multiple-left-outer-joins
반응형
'programing' 카테고리의 다른 글
SQL Server의 기존 테이블에 기본값 열 추가 (0) | 2023.04.07 |
---|---|
데이터베이스에 보기를 작성하는 이유는 무엇입니까? (0) | 2023.04.07 |
일별로 그룹화할 SQL 쿼리 (0) | 2023.04.07 |
SQL Server:크로스 조인(CROSS JOIN)과 풀 아우터 조인(FULL OUTER JOIN)의 차이점은 무엇입니까? (0) | 2023.04.07 |
서버 주체가 SQL Server MS 2012의 현재 보안 컨텍스트에서 데이터베이스에 액세스할 수 없습니다. (0) | 2023.04.07 |