到目前为止,我已经看到了很多关于多个内部连接的问题,但它们都没有解决我的问题。我一直在尝试对两个表进行内连接,并使用前面的一个表对第三个表进行子选择。
下面是sql代码:
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所做的尝试:
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上测试了这两种方法。
发布于 2011-12-22 22:57:50
在大量的“googling”之后找到了我的答案。我需要一个子查询来对另一个表执行搜索,而不是另一个连接。使用linq to sql方法Any做到了这一点。这是对我帮助最大的the post。
下面是翻译我的TSQL代码的linq to sql代码:
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
};发布于 2011-12-22 23:04:22
使用LINQ to SQL显式联接时,通常不应使用显式联接。如果设置了正确的关系,则应该具有可以使用的导航属性。有了这些,查询将如下所示:
from sched in SCHEDULES
where sched.status.debt != 2;如果数据库中有外键,则当您将这两个表放到设计器图面上时,导航属性将由SqlMetal.exe或or设计器自动生成。表之间的关系将显示为一条线(请参见下面的示例)。

https://stackoverflow.com/questions/8593641
复制相似问题