LINQ to Entities三表联合查询

5

我在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表为空或其中没有匹配项的情况下获取一些记录。如果您能提供任何帮助或提示,我将不胜感激! :-)
非常感谢您的帮助。
/ Bo
2个回答

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)


Joel,太棒了,干净利落!而且还可以正常工作 :-) 非常感谢。现在进入难点:您和cadrell0的回答都对我有所帮助,应该选择哪个答案作为正确答案呢?stackoverflow上的政策是什么? - bomortensen
如果我是提问者,我会为两个回答点赞,并接受最终使用的那一个。 - cadrell0

4

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


嗨cadrell0,我同意 :) 我尝试过了,但是它给了我这个错误:强制转换为值类型“Byte”失败,因为实现的值为空。结果类型的泛型参数或查询必须使用可空类型。 HasWonFirstPrize和HasWonVoucher确实是字节数据类型,但老实说我不希望它们在数据库中为空 :-) ? - bomortensen
你可能需要将HasWonFirstPrize的赋值更改为类似于HasWonFirstPrize = w == null ? 0 : w.hasWonFirstPrize的内容。 - cadrell0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接