我们有以下查询给我们一个左外连接:
(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();
问题是,如果左表(帐户)包含多个具有相同帐户代码值的行,则结果集包含第一行重复 - 因此第二行包含帐户代码,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语句做错了什么?
由于
答案 0 :(得分:1)
啊,那好多了。左边的连接看起来对我很好......但是所有人都不适合我。
假设我有一个订单记录,其中OrderId在dbml中设置为主键(但不在数据库中,允许创建重复记录)。如果我要查询Orders,OrderID = 5就在那里两次......当datacontext看到第一个带有OrderID的实例时,它开始跟踪它。当它看到第二个实例时,它会返回已经返回ID = 5的实例,而不是给行保湿。
如果我的查询结果是匿名类型,我就不会看到这种行为,因为匿名类型在dbml中没有主键,并且没有被datacontext跟踪。