2012-01-16 18 views
5

Mam trochę problemów z zapytaniem w Linq do Entities, które mam nadzieję, że ktoś może rzucić światło na :-) Co próbuję zrobić, aby utworzyć zapytanie, które łączy trzy tabele.LINQ do Entities trzy table join query

Do tej pory działa, ale ponieważ ostatnia tabela, którą próbuję dołączyć, jest pusta, wynik zapytania nie zawiera żadnych rekordów. Kiedy usuwam ostatnie sprzężenie, daje mi to właściwe wyniki.

Moja kwerenda wygląda następująco:

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          
      }; 

Chciałbym się dostać jakieś rekordy, nawet jeśli tabela zwycięzców jest pusta lub nie ma odpowiednika w nim.

Każda pomoc/wskazówka na ten temat jest bardzo doceniana! :-)

Dziękuję bardzo z góry.

/Bo

Odpowiedz

5

Jeśli je skonfigurować jako podmioty powiązane zamiast robić łączy, myślę, że będzie łatwiej zrobić to, co próbujesz zrobić.

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) 
      }; 

to zakładając hasWonFirstPrize i hasWonVoucher są polami logiczną, ale można użyć dowolnej funkcji zagregowanego aby uzyskać oczekiwane rezultaty, takie jak p.Winners.Any(w => w.hasWonFirstPrize == 1)

+0

Joel, to jest po prostu niesamowite i czyste! I działa :-) wielkie dzięki. Teraz ciężka część: zarówno twoja odpowiedź jak i cadrell0 faktycznie mi pomogły, więc która odpowiedź na znak jest akceptowana? Jakie są zasady dotyczące stackoverflow? – bomortensen

+0

Gdybym był pytającym, chciałbym przegłosować oba i zaakceptować którykolwiek z nich użyłem. – cadrell0

4

nie używam składnia kwerendy dużo, ale wierzę, trzeba zmienić from w in winnersGroup do from w in winnersGroup.DefaultIfEmpty()

+0

Hi cadrell0 zgadzam :) Próbowałem, ale to daje mi ten błąd: rzutowanie na typ wartości "Bajt" nie powiodło się, ponieważ zmaterializowana wartość jest pusta. Typowy parametr typu wynikowego lub zapytanie muszą używać typu zerowego. HasWonFirstPrize i HasWonVoucher są rzeczywiście bajtowymi typami danych, ale nie chcę, żeby były w bazie danych zerowe :-)? – bomortensen

+0

Prawdopodobnie będziesz musiał zmienić przypisanie HasWonFirstPrize na coś w stylu 'HasWonFirstPrize = w == null? 0: w.hasWonFirstPrize, ' – cadrell0

Powiązane problemy