2010-06-04 64 views
1

我們有以下查詢給我們一個左外連接:左外連接的結果發行使用LINQ to 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多行值,結果集包含第一行重複 - 因此第二行與帳戶代碼,sourcesystem和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

給定的組合是否有單個地址或多個地址?因爲連接會產生可能的匹配。如果您有一個擁有三個地址的帳戶,則查詢的結果將爲該帳戶的三行。關於您的查詢語法沒有任何不正確,但您可能需要以不同的方式處理問題。 – 2010-06-04 00:44:42

+0

如果我瞭解你,每一行都有帳號,源系統和mailingaddressstring的唯一組合。這只是LINQ結果集,其中副本出現在似乎只基於accountcode列的地方。 – 6footunder 2010-06-04 01:47:50

+0

此外,我們可以刪除插入後的所有代碼到t1_join中,並簡單替換爲「select t0」。所以其他條款都不影響結果。 有趣的是,在LinqPad,如果我們再嘗試: 選擇新{C1 = t0.new_accountcode,C2 = t0.new_sourcesystem,C3 = new_mailingaddressstring} 然後問題消失。這不能解決我們的問題,因爲在運行時我們不能使用匿名類型,我們也不能選擇一個新的Account對象(選擇新的Account {...})! – 6footunder 2010-06-04 01:52:04

回答

1

啊,那就好多了。左邊的加入看起來對我來說很好笑......但所有的東西都不適合我。

  • 這些列中的任何(或全部)是主鍵嗎?
  • datacontext的生命週期是什麼?它以前用於查詢嗎?它以前是否用來保存記錄?

假設我有一個OrderId集作爲主鍵在dbml中(但不在數據庫中,允許創建重複記錄)的Order記錄。如果我要查詢訂單,並且OrderID = 5在那裏兩次...當datacontext看到帶有OrderID的第一個實例時,它開始跟蹤它。當它看到第二個實例時,它將返回ID = 5已返回的實例,而不是補充行。

如果我的查詢結果是一個匿名類型,我不會看到這種行爲,因爲匿名類型在dbml中沒有主鍵,並且沒有被datacontext跟蹤。

+0

Sh * t。對不起 - 我們複製了查詢的簡化版本。我編輯了查詢,因此它是完整版本。道歉!!! – 6footunder 2010-06-04 01:44:52

+0

優秀!這是多虧了DB,只有帳號是主鍵!所以我想Linq可以管理連接,但是在選擇被觸發時不能區分對象嗎?乾杯! – 6footunder 2010-06-04 02:22:03

+0

好聽。拍攝實例水合器的一種方法是捕獲查詢(sql profiler)並手動檢查結果。如果數據庫結果與返回的實例不匹配,賓果遊戲 - 它必須是實例水合物。 – 2010-06-04 02:40:56