首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq to Sql -使用具有多个参数的多个内连接

Linq to Sql -使用具有多个参数的多个内连接
EN

Stack Overflow用户
提问于 2011-12-22 01:12:17
回答 2查看 3K关注 0票数 1

到目前为止,我已经看到了很多关于多个内部连接的问题,但它们都没有解决我的问题。我一直在尝试对两个表进行内连接,并使用前面的一个表对第三个表进行子选择。

下面是sql代码:

代码语言:javascript
复制
SELECT 
//It's a lot of select fields here. Nothing really useful to solve the problem 
FROM 
    SCHEDULES
INNER JOIN 
    STATUS
ON
    SCHEDULES.COMPANY              = STATUS.COMPANY          AND 
    SCHEDULES.BANK                 = STATUS.BANK             AND 
    SCHEDULES.PRODUCT              = STATUS.PRODUCT          AND 
    SCHEDULES.IDSTRING             = STATUS.IDSTRING         AND 
    SCHEDULES.RECEIVER       = 'ADMILSONDAMASCENO'     AND
    SCHEDULES.SCHEDULING < GETDATE()                   AND
    SCHEDULES.IDSTRING IN (
        SELECT DISTINCT IDSTRING  FROM DEBTS_BBRASIL WHERE
        DEBITOS_BBRASIL.COMPANY        = SCHEDULES.COMPANY        AND
        DEBITOS_BBRASIL.BANK           = SCHEDULES.BANK           AND
        DEBITOS_BBRASIL.PRODUCT        = SCHEDULES.PRODUCT        AND
        DEBITOS_BBRASIL.IDSTRING       = SCHEDULES.IDSTRING       AND
        DEBITOS_BBRASIL.STATUS         <> 2
)
ORDER BY SCHEDULES.SCHEDULING DESC

下面是对linq to sql所做的尝试:

代码语言:javascript
复制
 from sched in SCHEDULES
    join status in STATUS
      on new { sched.IDSTRING, sched.COMPANY, sched.BANK, sched.PRODUCT } 
      equals new { status.IDSTRING, status.COMPANY, status.BANK, status.PRODUCT } 
    into schedStats
    from ss in schedStats
    join debt in DEBITOS_BBRASILs
      on new { ss.IDSTRING, ss.COMPANY, ss.BANK, ss.PRODUCT }
      equals new { debt.IDSTRING, debt.COMPANY, debT.BANK, debt.PRODUCT }
    where sched.RECEIVER.Equals("ADMILSONDAMASCENO") && 
                         sched.SCHEDULING <= DateTime.Now && debt.STATUS != 2
    select new ScheduledStatus
    {
      //Lots of properties here
    };

然而,上面的代码先生成一个Cross-Join,然后再生成一个Inner-Join,我敢肯定这会复制一些结果。在SqlServer上测试第一个代码会产生189个结果,而我的linq to sql代码会产生546个结果。我不知道如何将相同的sql代码复制到linq to sql代码。

为了确定,我已经在linqPad上测试了这两种方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-22 22:57:50

在大量的“googling”之后找到了我的答案。我需要一个子查询来对另一个表执行搜索,而不是另一个连接。使用linq to sql方法Any做到了这一点。这是对我帮助最大的the post

下面是翻译我的TSQL代码的linq to sql代码:

代码语言:javascript
复制
    from sched in SCHEDULES
        join status in STATUS
          on new { sched.IDSTRING, sched.COMPANY, sched.BANK, sched.PRODUCT } 
          equals new { status.IDSTRING, status.COMPANY, status.BANK, status.PRODUCT } 
        where sched.RECEIVER.Equals("ADMILSONDAMASCENO") && 
              sched.SCHEDULING <= DateTime.Now && DEBITOS_BBRASILs.Any(dbb=> 
                    dbb.IDSTRING.Equals(sched.IDSTRING) 
                     && dbb.COMPANY.Equals(sched.COMPANY) 
                     && dbb.BANK.Equals(sched.BANK) 
                     && dbb.PRODUCT.Equals(sched.PRODUCT)
                     && dbb.STATUS != 2)
        select new ScheduledStatus
        {
         //Lots of properties here
         };
票数 1
EN

Stack Overflow用户

发布于 2011-12-22 23:04:22

使用LINQ to SQL显式联接时,通常不应使用显式联接。如果设置了正确的关系,则应该具有可以使用的导航属性。有了这些,查询将如下所示:

代码语言:javascript
复制
from sched in SCHEDULES
where sched.status.debt != 2;

如果数据库中有外键,则当您将这两个表放到设计器图面上时,导航属性将由SqlMetal.exe或or设计器自动生成。表之间的关系将显示为一条线(请参见下面的示例)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8593641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档