LINQ左连接SQL等效通过DefaultIfEmpty无法返回结果

时间:2017-10-17 12:39:13

标签: c# sql-server linq

我对SE进行了广泛的研究,尝试了所有的建议,检查了MSDN如何在LINQ to SQL中执行Left Join等效,我根据MSDN示例构建了我的LINQ查询。

但是,结果不是SQL会返回的结果,我完全不知道我哪里出错了。

以下是一些细节:

我有两个表,即客户和报告。客户可以提交许多报告,也可以不报告。在目前的状态下,我的报告比客户多得多。

LINQ代码:

MobilePhone(string phoneNumber, string name) : this(phoneNumber)
{
    this.name = name;
}

//this one is invoked using 'this(phoneNumber)' above
MobilePhone(string phoneNumber)
{
    this.phoneNumber = name;
}

SQL代码:

var query = {from c in customers
             join r in reports on c.Id equals r.Id into temp
             from items in temp.DefaultIfEmpty()
             select new { 
                 c.Id, 
                 LastReportDate = items?.DateCreated ?? DateTime.MinValue 
            }).ToList();

问题是查询返回的元素数等于报告数。但是,我想要的是获取所有客户的列表以及提交报告的人我想显示最新报告的日期,对于那些没有提交任何内容的人,我很高兴将其留下NULL或DateTime .MinValue

非常感谢任何帮助。我想我在LINQ代码中的某个地方错过了一个小组...

2 个答案:

答案 0 :(得分:1)

我想的可能是这样的:

var query = 
        from c in customers
        join r in reports on c.Id equals r.Id into g
        select new 
        { 
           c.Id, 
           LastReportDate = g.Max(x => (DateTime?)x.Created)
        };

答案 1 :(得分:0)

您现在加入<add-script src="script" type="application/javascript"></add-script> 这看起来像:加入一个customer.Id on Reports.Id,因为你说有1对多关系/关系。我认为你的表将有一个Reports.CustomerId。这是对的吗?

所以你的查询应该是这样的:

join r in reports on c.Id equals r.Id into temp

选择来自我的脑海,所以我可能错过了一些东西;)

你试过LinqPad吗?在那里你可以输入你的linq-queries,直接看你的sql代码和结果。像魅力一样工作!