1

左外部結合を提供する次のクエリがあります。

(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 値を持つ複数の行が含まれている場合、結果セットには複製された最初の行が含まれるため、accountcode、sourcesystem、および mailingaddressstring の一意の組み合わせを持つ 2 番目の行が「上書き」されることです。

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 ステートメントに何か問題がありますか?

ありがとう

4

1 に答える 1

1

あ、むしろその方がいいです。左の結合は私には桃色に見えます...しかし、すべてが私にはうまくいきません。

  • これらの列のいずれか (またはすべて) が主キーですか?
  • データコンテキストのライフサイクルは? 以前にクエリに使用されたことはありますか? 以前に記録を保存するために使用されたことはありますか?

OrderId が dbml の主キーとして設定された Order レコードがあるとします (ただし、データベースには存在しないため、重複レコードを作成できます)。Orders のクエリを実行し、OrderID = 5 が 2 回含まれている場合、データ コンテキストが OrderID を持つ最初のインスタンスを検出すると、追跡を開始します。2 番目のインスタンスを検出すると、行をハイドレートする代わりに、ID=5 で既に返されたインスタンスを返します。

クエリ結果が匿名型の場合、匿名型は dbml に主キーがなく、データ コンテキストによって追跡されないため、この動作は見られません。

于 2010-06-04T01:34:05.490 に答える