C# 实体框架&x2B;使用where子句进行Linq左连接?
我在实体框架5中使用Linq,并使用查询语法(我想,请更正我的术语)。我有一个参与者的表格,希望将他们的研究ID号与记录的SMS消息相关联,其中消息中的“收件人”或“发件人”号与参与者的电话号码匹配。此外,我希望从(或发送到)未知号码的消息也显示在列表中,在这种情况下,研究ID号将为空 下面是左连接的工作原始查询(如果有必要,请使用MySQL数据库): 以下是我到目前为止在Linq工作的内容,但这是一个内部连接:C# 实体框架&x2B;使用where子句进行Linq左连接?,c#,mysql,linq,entity-framework,C#,Mysql,Linq,Entity Framework,我在实体框架5中使用Linq,并使用查询语法(我想,请更正我的术语)。我有一个参与者的表格,希望将他们的研究ID号与记录的SMS消息相关联,其中消息中的“收件人”或“发件人”号与参与者的电话号码匹配。此外,我希望从(或发送到)未知号码的消息也显示在列表中,在这种情况下,研究ID号将为空 下面是左连接的工作原始查询(如果有必要,请使用MySQL数据库): 以下是我到目前为止在Linq工作的内容,但这是一个内部连接: var loggedMessages = from pp in theDb.par
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查询的教程链接,但是我需要添加什么才能使它成为左连接呢
编辑:请看下面我自己的答案 您需要添加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
};
经过一些快速和肤浅的研究,再加上一些更多的SO链接,我有以下生成所需结果。评论是非常受欢迎的,我从这个练习中学到的最大的一件事就是我有多少东西要学
var loggedMessages = from mm in theDb.messages
from pp in theDb.participants
.Where(pp1 => ((mm.from_phone == pp1.phone_number) || (mm.to_phone == pp1.phone_number)))
.DefaultIfEmpty()
orderby mm.ts descending
select new MessageLogEntry()
{
ParticipantId = (int?)pp.study_id_number,
TimeStamp = mm.ts,
FromPhone = mm.from_phone,
ToPhone = mm.to_phone,
Body = mm.body
};
我对它从查询语法到方法语法再到返回的方式有点震惊,但它经过编译,LinqPad喜欢它,并显示了正确的结果,并且进行了测试。我不知道它的性能和它可能的性能相比有多好,这是为了以后的课程
太棒了 确实有一个来自微软的教程:@Michael Dunlap,这是关于左外部联接的,如果联接术语正确,它会给我一个没有发送或接收任何消息的参与者列表,是吗?还有人对此感到困惑吗?@wdosanjos这似乎为我指明了正确的方向,即RFM。谢谢。@MichaelDunlap抱歉,显然并不是所有连接术语的定义都能区分简单的“左”(集合1中的所有元素和集合2中的匹配元素)和“左外”(仅集合1中集合2中不匹配的元素)。我们现在正在读……谢谢,但我比你快多了。:)联接语法中没有“或”。这就是问题1。问题#2是将其设为左联接,并且从Db.particients.DefaultIfEmpty()中的pp添加
,
似乎不起作用。
var loggedMessages = from mm in theDb.messages
from pp in theDb.participants
.Where(pp1 => ((mm.from_phone == pp1.phone_number) || (mm.to_phone == pp1.phone_number)))
.DefaultIfEmpty()
orderby mm.ts descending
select new MessageLogEntry()
{
ParticipantId = (int?)pp.study_id_number,
TimeStamp = mm.ts,
FromPhone = mm.from_phone,
ToPhone = mm.to_phone,
Body = mm.body
};