2012-01-16 9 views
5

Birinin bir ışık tutacağını umduğum varlıklar Linq'den bir soruna biraz sorun yaşıyorum :-) Yapmaya çalıştığım şey bir araya gelen bir sorgu oluşturmaktır üç tablo.LINQ to Varlıklar üç tablo birleştirme sorgusu

Şimdiye kadar çalışıyor, ancak katılmaya çalıştığım son tablo boş olduğundan, sorgunun sonucu herhangi bir kayıt içermiyor. Son birleştirmeyi kaldırdığımda, bana doğru sonuçları verir.

Benim sorgu şöyle görünür: Ben istiyorum ne

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

Kazananlar tablosu boş veya içinde herhangi bir eşleşme olsa bile bazı kayıtlar elde etmektir.

Bu konuda herhangi bir yardım/ipucu büyük beğeni topluyor! :-)

Çok önceden teşekkürler.

/Bo

Ben sorguyu kullanmayın

cevap

5

için from w in winnersGroup değiştirmeniz gerekir inanıyoruz, olacak düşünüyorum yapmaya çalıştığınız şeyi yapmak daha kolay.

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

Bu

hasWonFirstPrize ve hasWonVoucher boolean alanlar olduğunu varsayarak, ancak böyle p.Winners.Any(w => w.hasWonFirstPrize == 1) olarak size gereken sonuçları elde etme yöntemi herhangi toplama işlevini kullanabilirsiniz

+0

Joel, bu çok harika ve temiz! Ve çok çalışıyor :-) çok teşekkürler. Şimdi zor kısmı üzerine: hem senin cevabın hem de cadrell0'un aslında bana yardım ettiğine, hangi cevabın kabul edildiğine işaret etmelisin? Stackoverflow'taki politika nedir? – bomortensen

+0

Asker olsaydım ikisini de alırdım ve kullanmayı bittiklerimi kabul ederdim. – cadrell0

4

çok sözdizimi ama birleştirmeler yapmak yerine bu kadar gibi ilgili kuruluşlar ayarlarsanız size from w in winnersGroup.DefaultIfEmpty()

+0

Merhaba cadrell0, kabul ediyorum :) ben denedim ama bana bu hatayı verir: 'Byte' türüne değer veren cast başarısız oldu, çünkü materyalize değer boş. Sonuç türünün genel parametresi veya sorguda null bir tür kullanılmalıdır. HasWonFirstPrize ve HasWonVoucher gerçekten byte veri türleri, ama ben dürüst olmak için veritabanında boş olmalarını istemiyorum :-)? – bomortensen

+0

Muhtemelen HasWonFirstPrize ödevini HasewonFirstPrize = w == null gibi bir şeye değiştirmeniz gerekecektir. 0: w.hasWonFirstPrize, – cadrell0