LINQ到实体三表联接查询
我在Linq中对实体的查询有点麻烦,我希望有人能解释一下:-)我试图做的是创建一个连接三个表的查询 到目前为止,它还可以工作,但由于我尝试连接的最后一个表是空的,因此查询结果不包含任何记录。当我删除最后一个连接时,它会给出正确的结果 我的查询如下所示:LINQ到实体三表联接查询,linq,entity-framework,linq-to-entities,Linq,Entity Framework,Linq To Entities,我在Linq中对实体的查询有点麻烦,我希望有人能解释一下:-)我试图做的是创建一个连接三个表的查询 到目前为止,它还可以工作,但由于我尝试连接的最后一个表是空的,因此查询结果不包含任何记录。当我删除最后一个连接时,它会给出正确的结果 我的查询如下所示: var query = from p in db.QuizParticipants join points in db.ParticipantPoints on p.id equals point
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我不经常使用查询语法,但我相信您需要将winnersGroup中的
从w更改为,将winnersGroup.DefaultIfEmpty()中的从w更改为,
如果您将这些设置为相关实体,而不是执行联接,我认为您尝试执行的操作会更容易
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
和haswonconceducer
是布尔字段,但是您可以使用任何聚合函数来获得所需的结果,例如p.Winners.any(w=>w.hasWonFirstPrize==1)
Hi cadrell0,我同意:)我尝试过,但它给了我一个错误:转换为值类型“Byte”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为空的类型。HasWonFirstPrize和HasWonVoucher确实是字节数据类型,但老实说,我不希望它们在数据库中为null:-)?然后您可能需要将HasWonFirstPrize的赋值更改为类似于HasWonFirstPrize=w==null?0:w.Haswen一等奖,
Joel,真是太棒了,太干净了!它是有效的:-)非常感谢。现在进入困难的部分:你的答案和cadrell0的答案实际上都帮助了我,那么哪一个答案应该被标记为已接受?stackoverflow的政策是什么?如果我是询问者,我会将两者都投票并接受我最终使用的任何一个。