c# - Entity Framework + Linq LEFT JOIN 使用 where 子句?

标签 c# mysql linq entity-framework

我将 Linq 与 Entity Framework 5 结合使用并使用查询语法(我想,请更正我的术语)。我有一张参与者表,我想将他们的研究 ID 号与一条记录的 SMS 消息相关联,消息中的“收件人”或“发件人”号码与参与者的电话号码相匹配。此外,我希望从(或发送到)未知号码的消息也显示在列表中,在这种情况下,研究 ID 号将为空。

这是 LEFT JOIN 的工作原始查询(如果重要,使用 MySQL 数据库):

SELECT
    messages._id, participants.study_id_number, messages.ts,
    messages.from_phone, messages.to_phone, messages.body
FROM messages LEFT JOIN
    participants ON (   (participants.phone_number = messages.to_phone)
                     || (participants.phone_number = messages.from_phone))
ORDER BY messages.ts DESC;

这是我到目前为止在 Linq 中所做的工作,但它是一个内部连接:

var loggedMessages = from pp in theDb.participants
                     let phone = pp.phone_number
                     from mm in theDb.messages
                     let fromPhone = mm.from_phone
                     let toPhone = mm.to_phone
                     where ((phone == fromPhone) || (phone == toPhone))

                     orderby mm.ts descending
                     select new MessageLogEntry()
                     {
                         ParticipantId = pp.study_id_number,
                         TimeStamp = mm.ts,
                         FromPhone = fromPhone,
                         ToPhone = toPhone,
                         Body = mm.body
                     };

我是这方面的新手,所以我很乐意看到有关 Linq 查询的教程链接,但是我需要添加什么才能使其成为 LEFT JOIN?

编辑:请在下面查看我自己的回答。

最佳答案

您需要添加 DefaultIfEmpty() 使其成为左连接。

检查这个:

var loggedMessages = from pp in theDb.participants
                     join mm in theDb.messages
                     on pp.phone_number equals mm.to_phone || 
                     pp.phone_number equals mm.from_phone
                     into joinedmm
                     from pm in joinedmm.DefaultIfEmpty()
                     orderby mm.ts descending
                     select new MessageLogEntry()
                     {
                         ParticipantId = pp.study_id_number,
                         TimeStamp = pm.ts,
                         FromPhone = fromPhone,
                         ToPhone = toPhone,
                         Body = pm.body
                     };

关于c# - Entity Framework + Linq LEFT JOIN 使用 where 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805676/

相关文章:

sql - 我在 SQL 到 LINQ 转换中做错了什么?

c# - 如何最好地优化这一小段 C# Linq 代码

c# - 如何在 C# 中的字典上实现 linq?

SQL 类似问题

mysql - 使用分组依据

php - 'message' 中的意外列 'field list'

c# - 使用 linq 将字符串转换为 3D 数组

c# - 如何在自定义 ModelBinder 中从 body 获取数据?

c# - 如何使用 C# 部署 Helm 3 图表

c# - 我如何知道 Selenium 在父节点下的节点位置?