Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ到实体三表联接查询_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

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

我在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                                    
            };
我想得到的是一些记录,即使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的政策是什么?如果我是询问者,我会将两者都投票并接受我最终使用的任何一个。