LINQ:具有多个条件的左外连接

本文关键字:连接 条件 LINQ | 更新日期: 2023-09-27 18:16:07

我有两个IEnumerables分别叫做BaseReportDefinitions和InputReportDefinitions。我需要做一个左外连接,我想要所有的InputReportDefinitions和任何BaseReportDefinitions匹配。两个IEnumberables都包含ReportDefinition对象,其中包含需要用作连接键的ParentName和ReportName属性。我希望为匿名对象中的每个(在BaseReportDefinition条目的情况下,它可能为空)返回ReportDefinition对象。

我见过很多linq外连接和带静态第二条件的外连接的例子,这些条件通常被放在where条件中,但没有一个真正使用两个条件进行连接。

LINQ:具有多个条件的左外连接

var items = inputReportDefinitions.GroupJoin(
              baseReportDefinitions,
              firstSelector => new {
                         firstSelector.ParentName, firstSelector.ReportName
                                   },
              secondSelector => new {
                         secondSelector.ParentName, secondSelector.ReportName
                                   },
              (inputReport, baseCollection) => new {inputReport, baseCollection})
              .SelectMany(grp => grp.baseCollection.DefaultIfEmpty(),
                         (col, baseReport) => new
                                                 {
                                                    Base = baseReport,
                                                    Input = col.inputReport
                                                 });

我相信这最终是一个左外连接。我不知道如何将这个怪物转换成查询语句。我想如果你把AsQueryable()加到最后,它可以在Linq-to-SQL中使用,但老实说,我没有什么经验。

编辑:我明白了。更容易阅读:
var otherItems = from i in inputReportDefinitions
                         join b in baseReportDefinitions
                         on new {i.ParentName, i.ReportName} 
                         equals new {b.ParentName, b.ReportName} into other
                         from baseReport in other.DefaultIfEmpty()
                         select new
                                    {
                                        Input = i,
                                        Base = baseReport
                                    };