LINQ to Entities запрос на три таблицы соединения - PullRequest
5 голосов
/ 16 января 2012

У меня небольшая проблема с запросом в Linq для сущностей, который, я надеюсь, кто-то может пролить свет на :-) Я пытаюсь создать запрос, объединяющий три таблицы.

Пока это работает, но поскольку последняя таблица, к которой я пытаюсь присоединиться, пуста, результат запроса не содержит никаких записей. Когда я удаляю последнее соединение, оно дает мне правильные результаты.

Мой запрос выглядит так:

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

Я хотел бы получить некоторые записи, даже если таблица Победителей пуста или в ней нет совпадений.

Любая помощь / подсказка по этому вопросу очень ценится! : -)

Заранее большое спасибо.

/ Бо

Ответы [ 2 ]

5 голосов
/ 16 января 2012

Если вы установите их как связанные сущности вместо выполнения объединений, я думаю, вам будет проще делать то, что вы пытаетесь сделать.

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

Это предполагает hasWonFirstPrize и hasWonVoucher являются логическими полями, но вы можете использовать любую статистическую функцию для получения нужных вам результатов, например p.Winners.Any(w => w.hasWonFirstPrize == 1)

4 голосов
/ 16 января 2012

Я не часто использую синтаксис запроса, но считаю, что вам нужно изменить from w in winnersGroup на from w in winnersGroup.DefaultIfEmpty()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...