【发布时间】:2011-02-27 13:59:37
【问题描述】:
我们有以下查询来给我们一个左外连接:
(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();
问题在于,如果左表(帐户)包含具有相同帐户代码值的多行,则结果集包含重复的第一行 - 因此具有帐户代码、源系统和邮件地址字符串的唯一组合的第二行被“覆盖” .
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 语句做错了吗?
谢谢
【问题讨论】:
-
给定的组合是一个地址还是多个?因为连接会产生可能的匹配。如果您有一个具有三个地址的帐户,则查询的结果将是该帐户的三行。您的查询语法没有错误,但您可能需要以不同的方式解决问题。
-
如果我理解你的话,每一行都有一个唯一的 accountcode、sourcesystem 和 mailingaddressstring 组合。只有 LINQ 结果集出现重复似乎仅基于 accountcode 列。
-
另外,我们可以删除插入到 t1_join 后的所有代码,并简单地替换为“select t0”。所以其他子句都不会影响结果。有趣的是,在 LinqPad 中,如果我们尝试:选择 new {C1 = t0.new_accountcode, C2=t0.new_sourcesystem, C3=new_mailingaddressstring} 那么问题就消失了。这并不能解决我们的问题,因为在运行时我们不能使用匿名类型,也不能选择新的 Account 对象(选择新的 Account {...})!
标签: c# linq join outer-join