Entity Framework 조인 3 테이블


133

세 개의 테이블을 조인하려고하는데 방법을 이해할 수 없습니다 ...

조인 2 테이블을 완료했습니다

        var entryPoint = dbContext.tbl_EntryPoint
            .Join(dbContext.tbl_Entry,
                c => c.EID,
                cm => cm.EID,
                (c, cm) => new
                {
                    UID = cm.OwnerUID,
                    TID = cm.TID,
                    EID = c.EID,
                }).
            Where(a => a.UID == user.UID).Take(10);

테이블

TID PK와 함께 tbl_Title 테이블 을 포함 시키고 제목 필드를 얻고 싶습니다 .

고마워


이 관련 기사를 확인하십시오. 그것은 방법 표기법을 사용하지 않는 것, 당신은 요점 ... 얻을 수 있어야 stackoverflow.com/questions/11204367/...
xspydr

탐색 속성이 확장 된 사진을 보여주십시오. 탐색 속성은 기성품 조인입니다.
Gert Arnold

답변:


202

구문 기반 쿼리를 사용하면 더 쉬울 것이라고 생각합니다.

var entryPoint = (from ep in dbContext.tbl_EntryPoint
                 join e in dbContext.tbl_Entry on ep.EID equals e.EID
                 join t in dbContext.tbl_Title on e.TID equals t.TID
                 where e.OwnerID == user.UID
                 select new {
                     UID = e.OwnerID,
                     TID = e.TID,
                     Title = t.Title,
                     EID = e.EID
                 }).Take(10);

그리고 아마도 상위 10 개 항목을 올바르게 리턴 orderby하도록 절을 추가해야 Top(10)합니다.


3
이 방법에 대해 대단히 감사합니다. 명확하게 작동하지만 요청 한대로 답변을보고 싶습니다. 다시 감사드립니다.
Erçin Dedeoğlu

@MarcinJuraszek : 작동하려면 ViewModel이 필요한 경우 테이블을 조인해야합니까?
Vini

비동기가 없어도 작동하지 않습니다. 정확한 시나리오가 있지만 쿼리에서 [the_list_of_all_return_variables] 'serialize 할 수없는 예외가 발생합니다. @marcinJuraszek-당신은 stackoverflow.com/questions/42453123/…을
sandiejat

1
완전한! 당신은 나를 너무 많은 시간을 절약 :)
MohammadHossein R

81

이것은 테스트되지 않았지만 구문이 람다 쿼리에서 작동해야한다고 생각합니다. 이 구문을 사용하여 더 많은 테이블을 조인 할 때 조작하려는 값에 도달하려면 새 개체로 드릴 다운해야합니다.

var fullEntries = dbContext.tbl_EntryPoint
    .Join(
        dbContext.tbl_Entry,
        entryPoint => entryPoint.EID,
        entry => entry.EID,
        (entryPoint, entry) => new { entryPoint, entry }
    )
    .Join(
        dbContext.tbl_Title,
        combinedEntry => combinedEntry.entry.TID,
        title => title.TID,
        (combinedEntry, title) => new 
        {
            UID = combinedEntry.entry.OwnerUID,
            TID = combinedEntry.entry.TID,
            EID = combinedEntry.entryPoint.EID,
            Title = title.Title
        }
    )
    .Where(fullEntry => fullEntry.UID == user.UID)
    .Take(10);

17
끔찍 해요 프로덕션 코드에서 이러한 쿼리를 찾은 경우 즉시 리팩터링합니다. 그래도 질문에 대답하기 위해 +1!
Dan Bechard

8
@Dan 호기심에서 c, cm 및 ccm과의 모든 명명 규칙에서 생각하지 않거나 단순히 linq와 람다를 사용하여 조인을 수행하는 데 필요한 구문은 무시할 수 있습니까? 전자를 사용하고 더 나은 레이아웃을 갖도록 게시물을 편집하고 싶은 경우에는 항상 그 게시물을 작성하십시오. 저는 여전히 엔터티 프레임 워크를 처음 사용하고 있으며 모범 사례에 여전히 관심이 있으므로 향후 사용자에게이 답변을 더 웅변 적으로 제시 할 제안이 있으면 도움을 주셔서 감사합니다.
Pynt

4
필자가 언급했을 때 많은 이유를 제시하지는 않았지만 분명히 명명 규칙에 따라 가독성이 떨어졌습니다 (obv. OP에서 복사). 또한 줄의 시작 부분 인 쉼표는 가독성 (많은 주관적)을 손상시키고 공백 / 들여 쓰기가 약간 향상 될 수 있습니다. 귀하가 요청한 이후 이러한 모든 (IMHO) 개선 사항에 대한 수정 사항을 제출했습니다.
Dan Bechard

2
코드 형식은 종종 편향되지만 대부분의 사람들이 더 좋아 보이는 데 동의하는 일반적인 사항이 있습니다. 명명 규칙에 관해서는, 나는 실제로 짧은 이름을 부르는 데 사용했지만, 지금은 충분히 빨리 입력 할 수 있습니다 (Intellisense와 같은 것을 고려조차하지 않음) vs. "EID", "combinedEntry"vs. "cm"등. 결국 다른 누군가가 내 코드를 읽게 될 것입니다. 오히려 내 줄 수의 선형 함수로 인해 나를 미워하지 않을 것입니다. 그들이 읽고 유지해야했던 코드.
Dan Bechard

5
나는 단지 쉼표 시작 줄에 대한 논쟁을 얻지 못한다. 나는 개별 절 / 인수를 주석 처리하기가 정말 쉽기 때문에 확고한 신자입니다. 그리고 그것은 더 예쁘게 보인다 :-)
Auspex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.