2012-01-16 8 views
5

Tengo un problema con una consulta en Linq to Entities que espero que alguien pueda arrojar luz sobre :-) Lo que intento hacer es crear una consulta que se una tres tablasLINQ to Entities consulta de tabla de tres tablas

Hasta ahora funciona, pero como la última tabla que intento unir está vacía, el resultado de la consulta no contiene ningún registro. Cuando elimino la última unión, me da los resultados correctos.

Mi consulta es el siguiente:

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

Lo que me gustaría es conseguir algunos registros, incluso si la tabla de ganadores está vacío o no hay ninguna coincidencia en el mismo.

¡Cualquier ayuda/insinuación sobre esto es muy apreciada! :-)

Muchas gracias de antemano.

/Bo

Respuesta

5

Si configura estas entidades arriba como relacionados en vez de hacer combinaciones, creo que lo hará sea ​​más fácil hacer lo que está tratando de hacer.

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

Esto es suponiendo hasWonFirstPrize y hasWonVoucher son campos booleanos, pero se puede usar cualquier función de agregación para obtener los resultados que necesita, como p.Winners.Any(w => w.hasWonFirstPrize == 1)

+0

Joel, ¡eso es tan genial y limpio! Y funciona :-) Muchas gracias. Ahora en la parte difícil: tanto tu respuesta como cadrell0 en realidad me han ayudado, entonces, ¿qué respuesta marcar como aceptada? ¿Cuál es la política sobre stackoverflow? – bomortensen

+0

Si yo fuera el autor de la pregunta, rechazaría ambas opciones y aceptaría la que terminase usando. – cadrell0

4

yo no uso la sintaxis de consulta mucho, pero creo que es necesario cambiar from w in winnersGroup a from w in winnersGroup.DefaultIfEmpty()

+0

Hola cadrell0, estoy de acuerdo :) lo probé, pero me da este error: Falló la conversión al tipo de valor 'Byte' porque el valor materializado es nulo. O el parámetro genérico del tipo de resultado o la consulta debe usar un tipo anulable. HasWonFirstPrize y HasWonVoucher son de hecho byte datatypes, pero no quiero que sean nulos en la base de datos para ser honestos :-)? – bomortensen

+0

Probablemente necesitará cambiar la asignación de HasWonFirstPrize a algo como 'HasWonFirstPrize = w == null? 0: w.hasWonFirstPrize, ' – cadrell0

Cuestiones relacionadas