2012-01-16 37 views
5

Tôi đang gặp một chút rắc rối với truy vấn trong LINQ to Entities mà tôi hy vọng ai đó có thể làm sáng tỏ :-) Điều tôi đang cố gắng làm là tạo truy vấn tham gia ba bảng.LINQ to Entities ba bảng tham gia truy vấn

Tính đến thời điểm này, nhưng vì bảng cuối cùng tôi đang cố gắng tham gia trống, kết quả của truy vấn không chứa bất kỳ bản ghi nào. Khi tôi xóa lần kết nối cuối cùng, nó sẽ cho tôi kết quả đúng.

truy vấn của tôi trông như thế này:

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

Những gì tôi muốn là để có được một số hồ sơ ngay cả khi bảng Winners là rỗng hoặc không có trận đấu trong đó.

Bất kỳ trợ giúp/gợi ý nào về điều này được đánh giá cao! :-)

Cảm ơn rất nhiều trước.

/Bo

Trả lời

5

Nếu bạn thiết lập các đơn vị lên như có liên quan thay vì làm tham gia, tôi nghĩ rằng nó sẽ dễ dàng hơn để làm những gì bạn đang cố gắng làm.

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

Đây là giả hasWonFirstPrizehasWonVoucher là lĩnh vực boolean, nhưng bạn có thể sử dụng bất kỳ chức năng tổng hợp để có được những kết quả mà bạn cần, chẳng hạn như p.Winners.Any(w => w.hasWonFirstPrize == 1)

+0

Joel, điều đó thật tuyệt vời và sạch sẽ! Và nó hoạt động :-) cảm ơn rất nhiều. Bây giờ vào phần khó khăn: cả câu trả lời của bạn và cadrell0 thực sự đã giúp tôi, vì vậy mà câu trả lời để đánh dấu là chấp nhận? Chính sách về stackoverflow là gì? – bomortensen

+0

Nếu tôi là người hỏi, tôi sẽ upvote cả hai và chấp nhận bất cứ điều gì tôi đã kết thúc bằng cách sử dụng. – cadrell0

4

tôi không sử dụng cú pháp truy vấn rất nhiều nhưng tôi tin rằng bạn cần phải thay đổi from w in winnersGroup-from w in winnersGroup.DefaultIfEmpty()

+0

Hi cadrell0, tôi đồng ý :) Tôi đã thử nó, nhưng nó cung cấp cho tôi lỗi này: Giá trị truyền tới loại giá trị 'Byte' không thành công do giá trị vật hoá là rỗng. Tham số chung của loại kết quả hoặc truy vấn phải sử dụng một loại nullable. HasWonFirstPrize và HasWonVoucher thực sự là các kiểu dữ liệu byte, nhưng tôi không muốn chúng được null trong cơ sở dữ liệu thành thật :-)? – bomortensen

+0

Bạn có lẽ sẽ cần phải thay đổi việc gán HasWonFirstPrize thành một cái gì đó như 'HasWonFirstPrize = w == null? 0: w.hasWonFirstPrize, ' – cadrell0

Các vấn đề liên quan