LINQ:左外连接有多个条件

lei*_*fre 1 c# linq outer-join

我有两个名为BaseReportDefinitions和InputReportDefinitions的IEnumerables.我需要做一个左外连接,我想要所有的InputReportDefinitions和匹配的BaseReportDefinitions.两个IEnumberables都包含ReportDefinition对象,这些对象包含需要用作连接键的ParentName和ReportName属性.我想在匿名对象中为每个(在BaseReportDefinition条目的情况下,它可能为null)返回ReportDefinition对象.

我已经看到了linq外连接和外连接的许多例子,它们具有静态的第二个条件,经常被放入where条件但没有真正完全用于连接的两个条件.

Chr*_*ens 8

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
                                                 });
Run Code Online (Sandbox Code Playgroud)

我相信这最终会成为一个左外连接.我不知道如何将这个monstrosity转换为查询语句.我想如果你添加AsQueryable()到它可以在LINQ到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
                                    };
Run Code Online (Sandbox Code Playgroud)