2010-06-04 62 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