我有两个名为BaseReportDefinitions和InputReportDefinitions的IEnumerables。我需要做一个左外连接,我想要所有的InputReportDefinitions和匹配的BaseReportDefinitions。两个IEnumberables都包含ReportDefinition对象,这些对象包含需要用作连接键的ParentName和ReportName属性。我想在匿名对象中为每个(在BaseReportDefinition条目的情况下,它可能为null)返回ReportDefinition对象。
我已经看到了linq外连接和外连接的许多例子,它们具有静态的第二个条件,经常被放入where条件但没有真正完全用于连接的两个条件。
答案 0 :(得分: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
});
我相信这最终会成为一个左外连接。我不知道如何将这个monstrosity转换为查询语句。我想如果你将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
};