LINQ to Entities三表连接查询

时间:2012-01-16 19:35:26

标签: linq entity-framework linq-to-entities

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

我想要的是获取一些记录,即使Winners表为空或者没有匹配。

非常感谢任何帮助/暗示! : - )

提前多多感谢。

/博

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:4)

我不经常使用查询语法,但我相信您需要将from w in winnersGroup更改为from w in winnersGroup.DefaultIfEmpty()