문제

다음 SQL 쿼리로 작업 중입니다.

SELECT 
a.AppointmentId,
a.Status,
a.Type,
a.Title,
b.Days,
d.Description,
e.FormId
FROM Appointment a (nolock)
LEFT JOIN AppointmentFormula b (nolock)
ON a.AppointmentId = b.AppointmentId and b.RowStatus = 1
JOIN Type d (nolock)
ON a.Type = d.TypeId
LEFT JOIN AppointmentForm e (nolock)
ON e.AppointmentId = a.AppointmentId
WHERE a.RowStatus = 1
AND a.Type = 1
ORDER BY a.Type

LINQ에서 조인을 달성하는 방법은 확실하지 않습니다. 내 모든 테이블에는 외국의 주요 관계가 있습니다.

도움이 되었습니까?

해결책

내가 커프에서 벗어나면서 이것을 약간 조정해야 할 수도 있지만, 명심해야 할 몇 가지 주요 사항이 있습니다. DBML에 관계가 제대로 설정되어 있으면 내부 조인을 암시 적으로 수행하고 초기 테이블을 통해 데이터에 액세스 할 수 있어야합니다. 또한 LINQ의 왼쪽 조인은 우리가 기대할 수있는 것만 큼 간단하지 않으며,이를 실현하기 위해서는 Defaultifempty 구문을 거쳐야합니다. 여기서 익명 유형을 만들었지 만 DTO 클래스 나 그 효과에 무언가를 넣고 싶을 수도 있습니다. 나는 또한 당신이 Nulls의 경우 무엇을하고 싶었는지 몰랐지만, 당신은 그것을 사용할 수 있습니까 ?? 구문 값이 null 인 경우 변수를 제공하기 위해 값을 정의합니다. 추가 질문이 있으면 알려주세요 ...

var query = (from a in context.Appointment
join b in context.AppointmentFormula on a.AppointmentId equals b.AppointmentId into temp
from c in temp.DefaultIfEmpty()
join d in context.AppointmentForm on a.AppointmentID equals e.AppointmentID into temp2
from e in temp2.DefaultIfEmpty()
where a.RowStatus == 1 && c.RowStatus == 1 && a.Type == 1
select new {a.AppointmentId, a.Status, a.Type, a.Title, c.Days ?? 0, a.Type.Description, e.FormID ?? 0}).OrderBy(a.Type);

다른 팁

SELECT A.X, B.Y
FROM A JOIN B ON A.X = B.Y

이 LINQ 메소드 호출 (조인)은 위의 조인을 생성합니다.

var query = A.Join
(
  B,
  a => a.x,
  b => b.y,
  (a, b) => new {a.x, b.y} //if you want more columns - add them here.
);

SELECT A.X, B.Y
FROM A LEFT JOIN B ON A.X = B.Y

이 LINQ 메소드 호출 (GroupJoin, SelectMany, Defaultifempty)으로 위의 왼쪽 결합이 생성됩니다.

var query = A.GroupJoin
(
  B,
  a => a.x,
  b => b.y,
  (a, g) => new {a, g}
).SelectMany
(
  z => z.g.DefaultIfEmpty(),
  (z, b) =>
    new  { x = z.a.x, y = b.y } //if you want more columns - add them here.
);

여기서 핵심 개념은 LINQ의 방법이 평평한 행 열 모양이 아닌 계층 적으로 형성 된 결과를 생성한다는 것입니다.

  • LINQ GroupBy 그룹화 키가 일치하는 계층 구조에서 형성된 결과를 생성합니다. 수집 요소의 (비어 있지 않을 수 있음). SQL GroupBy 절은 그룹화 키를 생성합니다 집계 된 값 - 작업 할 부분 수집이 없습니다.
  • 마찬가지로 LINQ GroupJoin 계층 적 모양을 생성합니다. 수집 아동 기록 (비어있을 수 있음). SQL LEFT JOIN 각 어린이 기록과 일치하는 부모 기록 또는 다른 경기가없는 경우 Null Child Record를 생성합니다. LINQ의 모양에서 SQL의 모양을 얻으려면 자식 기록 모음을 풀어야합니다. SelectMany - 그리고 사용한 빈 자녀 기록 컬렉션을 처리 DefaultIfEmpty.

그리고 다음은 그 문제에서 그 SQL을 Linquify에 대한 나의 시도입니다.

var query =
  from a in Appointment
  where a.RowStatus == 1
  where a.Type == 1
  from b in a.AppointmentFormula.Where(af => af.RowStatus == 1).DefaultIfEmpty()
  from d in a.TypeRecord //a has a type column and is related to a table named type, disambiguate the names
  from e in a.AppointmentForm.DefaultIfEmpty()
  order by a.Type
  select new { a.AppointmentId, a.Status, a.Type, a.Title, b.Days, d.Description, e.Form }

(nolock) 힌트를 보존하고 싶다면 편리한 솔루션을 블로그로 작성했습니다 C#에서 확장 방법을 사용합니다. 이것은 쿼리의 모든 테이블에 Nolock 힌트를 추가하는 것과 동일합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top