2012-01-16 2 views
5

Linq에서 Entity에 대한 질의에 약간의 문제가 있습니다. 누군가가 다음과 같이 빛을 비출 수 있기를 바랍니다 .- 내가 뭘하려고하는지 조인하는 쿼리를 만드는 것입니다. 세 개의 테이블.LINQ to Entities 3 테이블 조인 쿼리

지금까지 작동하지만 마지막 조인 테이블이 비어 있기 때문에 쿼리 결과에 레코드가 포함되어 있지 않습니다. 마지막 참여를 제거하면 올바른 결과를 얻을 수 있습니다.

내 쿼리는 다음과 같습니다 : 내가 좋아하는 것이 무엇

var query = from p in db.QuizParticipants 
      join points in db.ParticipantPoints on p.id 
      equals points.participantId into participantsGroup 
      from po in participantsGroup 
      join winners in db.Winners on p.id 
      equals winners.participantId into winnersGroup 
      from w in winnersGroup 
      where p.hasAttended == 1 && p.weeknumber == weeknumber 
      select new 
      { 
       ParticipantId = p.id, 
       HasAttended = p.hasAttended, 
       Weeknumber = p.weeknumber, 
       UmbracoMemberId = p.umbMemberId, 
       Points = po.points, 
       HasWonFirstPrize = w.hasWonFirstPrize, 
       HasWonVoucher = w.hasWonVoucher          
      }; 

은 수상자 테이블이 비어 있거나 그것에 일치가없는 경우에도 일부 레코드를 얻는 것입니다.

이 도움말/힌트를 크게받습니다! :-)

미리 감사드립니다.

/보

내가 쿼리를 사용하지 않는

답변

5

from w in winnersGroup을 변경할 필요가 생각 나는 것 같아요 당신이하려는 일을하기가 더 쉽습니다.

var query = from p in db.QuizParticipants 
      where p.hasAttended == 1 && p.weeknumber == weeknumber 
      select new 
      { 
       ParticipantId = p.id, 
       HasAttended = p.hasAttended, 
       Weeknumber = p.weeknumber, 
       UmbracoMemberId = p.umbMemberId, 
       Points = p.ParticipantPoints.Sum(pts => pts.points), 
       HasWonFirstPrize = p.Winners.Any(w => w.hasWonFirstPrize), 
       HasWonVoucher = p.Winners.Any(w => w.hasWonVoucher) 
      }; 

hasWonFirstPrizehasWonVoucher 부울 필드입니다 가정,하지만 당신은 p.Winners.Any(w => w.hasWonFirstPrize == 1) 같은 당신이 필요로하는 결과를 얻을 수있는 집계 함수를 사용할 수 있습니다

+0

Joel, 정말 멋지고 깨끗합니다! 그리고 그것은 작동합니다 :-) 많이 감사합니다. 이제 어려운 부분에 : 귀하의 답변과 cadrell0 모두 실제로 나를 도왔습니다. 그래서 어떤 대답을 받아 들일 수 있습니까? stackoverflow에 대한 정책은 무엇입니까? – bomortensen

+0

내가 부탁하는 사람이라면, 나는 둘 다 upvote하고 내가 사용하는 것을 끝내었던 것을 받아 들일 것이다. – cadrell0

4

많이 구문하지만 난 당신이 조인하고 대신이 최대로 관련 기관을 설정하면이 from w in winnersGroup.DefaultIfEmpty()

+0

안녕 cadrell0, 동의 :) 나는 그것을 시도하지만, 나에게이 오류를 준다 : 구체화 된 값이 null이므로 값 유형 'Byte'에 대한 형변환이 실패했다. 결과 유형의 제네릭 매개 변수 또는 쿼리가 null 가능 유형을 사용해야합니다. HasWonFirstPrize 및 HasWonVoucher는 실제로 바이트 데이터 유형이지만 데이터베이스에 null이 없도록하려면 정직해야합니다. – bomortensen

+0

그러면 HasWonFirstPrize의 할당을 'HasWonFirstPrize = w == null'과 같이 변경해야 할 것입니다. 0 : w.hasWonFirstPrize, ' – cadrell0