LINQ: левое внешнее соединение с несколькими условиями

У меня есть два IEnumerable с именами BaseReportDefinitions и InputReportDefinitions. Мне нужно выполнить левое внешнее соединение, где мне нужны все InputReportDefinitions и любые соответствующие BaseReportDefinitions. Оба IEnumberables содержат объекты ReportDefinition, которые содержат свойства ParentName и ReportName, которые необходимо использовать в качестве ключа соединения. Я хочу вернуть объект ReportDefinition для каждого (в случае записи BaseReportDefinition он может быть нулевым) в анонимном объекте.

Я видел много примеров внешних соединений linq и внешних соединений со статическим вторым условием, которое часто помещается в условие where, но ничего, что действительно полностью использует два условия для соединения.


person leifre    schedule 29.11.2011    source источник
comment
Вот хорошая статья о левом присоединении к смехрозалам .wordpress.com / 2009/06/10 / - пробовали ли вы похожие примеры?   -  person Vitaliy    schedule 29.11.2011


Ответы (1)


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
                                    };
person Christopher Currens    schedule 29.11.2011