LINQ Полное внешнее соединение в диапазоне дат

#c# #linq #join

Вопрос:

Я работаю над отчетом, который определяет, когда должны были быть отправлены уведомления. Таблица 1 содержит данные, используемые для определения того, когда должно было быть отправлено уведомление, таблица 2 содержит данные обо всех отправленных уведомлениях. Мне нужно иметь возможность отображать таблицу, которая связывает требуемое уведомление с отправленным уведомлением, показывает, когда уведомление не было отправлено, и показывает, когда уведомление было отправлено без подтверждающей документации. Уведомление должно быть отправлено в течение 2 недель. Мне нужно иметь возможность выполнить полное внешнее соединение, как показано ниже, с добавлением двух полей даты, таблица 2.дата находится в течение 2 недель после таблицы 1.дата. При внутреннем соединении я мог бы просто использовать предложение where, но что мне делать при внешнем соединении, чтобы не потерять записи, которые не совпадают?

 var leftOuterJoin =
    from first in table1
    join last in table2 on new {A = first.ID, B = first.Type} equals new {last.ID, last.Type} into temp
    from last in temp.DefaultIfEmpty()
    select new
    {
        first.ID,
        Col1 = first.col1,
        Col2 = first.col2,
        Col3 = last?.Col3,
        Col4 = last?.col4
    };
var rightOuterJoin =
    from last in table2
    join first in table1 new {last.ID, last.Type} equals new {A = first.ID, B = first.Type} into temp
    from first in temp.DefaultIfEmpty()
    select new
    {
        last.ID,
        Col1 = first?.col1,
        Col2 = first?.col2,
        Col3 = last.Col3,
        Col4 = last.col4
    };
var fullOuterJoin = leftOuterJoin.Union(rightOuterJoin);
 

Комментарии:

1. Вы должны иметь возможность добавлять where после каждой секунды from...DefaultIfEmpty() для фильтрации по дате: where (last.date-first.date).TotalDays / 7 <= 14 .

2. Это не работает, потому что первое или последнее значение будет равно нулю, если совпадение отсутствует, и вызовет исключение.

3. Какой LINQ вы используете: LINQ для объектов / SQL / EF 6.x / EF Core 2.0 / 2.1 / 3.x / 5.x / 6.x? Какой поставщик баз данных?