2010-06-04 2 views
1

У нас есть следующий запрос, чтобы дать нам левое внешнее соединение: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?

С благодарностью

+1

Имеет ли данная комбинация один или несколько адресов? Потому что соединение даст возможные совпадения. Если у вас есть одна учетная запись с тремя адресами, результатом вашего запроса будет три строки для учетной записи. В вашем синтаксисе запроса нет ничего неправильного, но вам может понадобиться подойти к проблеме по-другому. –

+0

Если я понимаю вас, каждая строка имеет уникальную комбинацию кода счета, sourceystem и mailingaddressstring. Это только результат результата LINQ, где дубликаты возникают, по-видимому, только на основе столбца accountcode. – 6footunder

+0

Кроме того, мы можем удалить весь код после вставки в t1_join и просто заменить на «select t0». Таким образом, ни один из других пунктов не влияет на результат. Интересно, что в LINQPad, если мы затем попробовать: Выбрать новый {C1 = t0.new_accountcode, C2 = t0.new_sourcesystem, C3 = new_mailingaddressstring} тогда проблема уходит. Это не устраняет нашу проблему, так как во время выполнения мы не можем использовать анонимные типы, и мы не можем выбрать новый объект Account (выберите новую учетную запись {...})! – 6footunder

ответ

1

А, хорошо, это намного лучше. Левое соединение выглядит просто персиковым для меня ... но со мной все плохо.

  • Являются ли какие-либо (или все) из этих столбцов первичным ключом?
  • Каков жизненный цикл datacontext? Раньше он использовался для запроса? Раньше он использовался для сохранения записей?

Предположим, у меня есть запись заказа с OrderId, установленным в качестве первичного ключа в dbml (но не в базе данных, что позволяет создавать повторяющиеся записи). Если бы я запросил заказы, а OrderID = 5 там дважды ... когда datacontext видит первый экземпляр с OrderID, он начинает отслеживать его. Когда он видит второй экземпляр, вместо того, чтобы увлажнять строку, он возвращает экземпляр, который он уже вернул с идентификатором = 5.

Если мой результат запроса является анонимным, я бы не видел этого поведения, так как анонимный тип не имеет первичного ключа в dbml и не отслеживается datacontext.

+0

Sh * t. К сожалению, мы скопировали упрощенную версию запроса. Я отредактировал запрос, так что это полная версия. Извинения !!! – 6footunder

+0

Отлично! Это было благодаря DB, только основной код был основным ключом! Итак, я думаю, Linq может управлять соединением, но не различать объекты при срабатывании select? Ура! – 6footunder

+0

Приятно послушать. Одним из способов съемки гидратора экземпляра является захват запроса (sql-профайлер) и проверка результатов вручную. Если результаты базы данных не совпадают с возвращаемыми экземплярами, бинго - это должен быть гидратор экземпляра. –

Смежные вопросы