2012-01-16 144 views
5

我在LINQ查詢中遇到了點麻煩,希望有人可以點亮一下:-)我在做的是創建一個連接查詢三張桌子。LINQ to Entities三表加入查詢

到目前爲止它的工作原理,但自從我試圖加入的最後一個表是空的,查詢的結果不包含任何記錄。當我刪除最後一個連接時,它給了我正確的結果。

我的查詢看起來是這樣的:

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

如果設置這些爲相關實體,而不是做加入的,我認爲它會更容易做你想做的事情。

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

喬爾,那真棒,乾淨!它的工作原理:-)非常感謝。現在到了困難的部分:您的答案和cadrell0實際上對我有幫助,因此哪個答案被視爲已被接受?什麼是stackoverflow的政策? – bomortensen 2012-01-16 20:04:00

+0

如果我是提問者,我會同時投票並接受我最終使用的那一個。 – cadrell0 2012-01-16 21:24:08

4

我不使用查詢語法了很多,但我相信你需要改變from w in winnersGroupfrom w in winnersGroup.DefaultIfEmpty()

+0

嗨cadrell0,我同意:)我試過,但它給我這個錯誤:由於物化值爲空,所以強制轉換爲值類型「字節」失敗。結果類型的泛型參數或查詢都必須使用可爲空的類型。 HasWonFirstPrize和HasWonVoucher實際上是字節數據類型,但我不希望它們在數據庫中爲空:-)? – bomortensen 2012-01-16 19:45:37

+0

您可能需要將HasWonFirstPrize的賦值更改爲'HasWonFirstPrize = w == null? 0:w.hasWonFirstPrize,' – cadrell0 2012-01-16 19:50:02