2012-01-16 16 views
5

Linqのエンティティへのクエリに少し問題があります。誰かが光を当てることを願っています:-)私がしようとしているのは、結合するクエリを作成することです3つのテーブル。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など、必要な結果を得るために、任意の集計関数を使用することができ、私はそれを試してみました:)同意するが、それ私にこのエラーが表示されます。値の型が 'Byte'へのキャストが失敗しました。結果タイプの汎用パラメーターまたは照会のいずれかがNULL可能タイプを使用する必要があります。 HasWonFirstPrizeとHasWonVoucherは確かにバイトデータ型ですが、私はそれらがデータベース内で正当であることを望んでいません:-)? – bomortensen

+0

おそらく、HasWonFirstPrizeの割り当てを 'HasWonFirstPrize = w == null 'のように変更する必要がありますか? 0:w.hasWonFirstPrize、 ' – cadrell0