Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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
C# 实体框架&x2B;使用where子句进行Linq左连接?_C#_Mysql_Linq_Entity Framework - Fatal编程技术网

C# 实体框架&x2B;使用where子句进行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

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

下面是左连接的工作原始查询(如果有必要,请使用MySQL数据库):

以下是我到目前为止在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查询的教程链接,但是我需要添加什么才能使它成为左连接呢


编辑:请看下面我自己的答案

您需要添加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
                     };