到目前为止,我已经看到很多关于多个内部联接的SO问题,但是他们都没有解决我的问题。我一直在尝试在两个表上进行内部连接,并使用上一个表中的一个在第三个表上进行子查询。Linq to Sql - 使用具有多个参数的多个内部联接
这里的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做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到SQL代码。
我已经在linqPad上测试了它,只是为了确定。
您是否尝试过查看生成的sql查询线索? DbContext.Log = Console.Out(其中DbContext是您的dbContext)将在调试时将生成的SQL放入您的输出窗口。 – 2011-12-21 17:18:34
由于您已经有了TSQL,为什么不使用表值函数?然后使用LINQ to SQL调用函数。 http://msdn.microsoft.com/en-us/library/ms191165(v=SQL.100).aspx – Dave 2011-12-21 17:34:40
不知道表值函数,感谢您的显示。但是,我不能使用它,因为我们有严格的策略,不要在数据库上放置任何逻辑。 – AdrianoRR 2011-12-22 12:37:46