У нас есть следующий запрос, чтобы дать нам левое внешнее соединение:Left Outer Регистрация Результат Issue Использование Linq для Sql
(from t0 in context.accounts
join t1 in context.addresses
on new { New_AccountCode = t0.new_accountcode, New_SourceSystem = t0.new_sourcesystem, New_Mailing = t0.new_MailingAddressString }
equals new { New_AccountCode = t1.new_AccountCode, New_SourceSystem = t1.new_SourceSystem, New_Mailing = t1.new_MailingAddressString } into t1_join
from t1 in t1_join.DefaultIfEmpty()
where
t0.statecode != 1 &&
t0.statuscode != 2 &&
t1.new_AccountCode == null &&
t1.new_SourceSystem == null &&
t1.new_MailingAddressString == null
select t0)
.OrderBy(o => o.new_accountcode)
.ThenBy(o2=>o2.new_sourcesystem)
.Skip(recordsProcessed)
.Take(recordBatchSize).ToList();
Вопрос заключается в том, что если левая таблица (счета) содержит несколько строк с одинаковым accountcode value, результирующий набор содержит первую строку, дублируемую, поэтому вторая строка с уникальной комбинацией кода учетной записи, sourceystem и mailingaddressstring «перезаписывается».
Given:
accounts
accountcode sourcesystem mailingaddressstring
10025 ss1 12345
10025 ss2 67891
addresses
accountcode sourcesystem mailingaddressstring
10025 ss1 12345
10025 ss2 67891
we get:
accountcode sourcesystem mailingaddressstring
10025 ss1 12345
10025 ss1 12345
Выполняем ли мы что-то неправильно с инструкцией select?
С благодарностью
Имеет ли данная комбинация один или несколько адресов? Потому что соединение даст возможные совпадения. Если у вас есть одна учетная запись с тремя адресами, результатом вашего запроса будет три строки для учетной записи. В вашем синтаксисе запроса нет ничего неправильного, но вам может понадобиться подойти к проблеме по-другому. –
Если я понимаю вас, каждая строка имеет уникальную комбинацию кода счета, sourceystem и mailingaddressstring. Это только результат результата LINQ, где дубликаты возникают, по-видимому, только на основе столбца accountcode. – 6footunder
Кроме того, мы можем удалить весь код после вставки в t1_join и просто заменить на «select t0». Таким образом, ни один из других пунктов не влияет на результат. Интересно, что в LINQPad, если мы затем попробовать: Выбрать новый {C1 = t0.new_accountcode, C2 = t0.new_sourcesystem, C3 = new_mailingaddressstring} тогда проблема уходит. Это не устраняет нашу проблему, так как во время выполнения мы не можем использовать анонимные типы, и мы не можем выбрать новый объект Account (выберите новую учетную запись {...})! – 6footunder