【问题标题】:LINQ to Entities three table join queryLINQ to Entities 三表连接查询
【发布时间】:2012-01-16 19:35:26
【问题描述】:

我在 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 表为空或其中没有匹配项,我想要获取一些记录。

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

非常感谢。

/博

【问题讨论】:

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


    【解决方案1】:

    如果您将它们设置为相关实体而不是进行连接,我认为执行您想做的事情会更容易。

    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)

    【讨论】:

    • 乔尔,真是太棒了,太干净了!它有效:-) 非常感谢。现在进入困难的部分:您的答案和 cadrell0 的答案实际上都帮助了我,那么哪个答案标记为已接受? stackoverflow 的政策是什么?
    • 如果我是提问者,我会赞成两者并接受我最终使用的任何一个。
    【解决方案2】:

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

    【讨论】:

    • 嗨 cadrell0,我同意 :) 我试过了,但它给了我这个错误: 转换为值类型 'Byte' 失败,因为物化值为空。结果类型的泛型参数或查询必须使用可为空的类型。 HasWonFirstPrize 和 HasWonVoucher 确实是字节数据类型,但老实说,我不希望它们在数据库中为空 :-)?
    • 您可能需要将 HasWonFirstPrize 的分配更改为 HasWonFirstPrize = w == null ? 0 : w.hasWonFirstPrize,
    猜你喜欢
    • 2017-02-07
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多