我有一个在SQL中完美运行的查询,但我有最大的时间将其转换为linq。表(下面的表1)保存了多种记录类型的状态更改。连接需要设置两个字段来创建有效的连接:SubmissionId(状态所属的表的pk)和SubmissionTypeId(确定状态所属的表)。
CREATE TABLE ##Table1 (Id int, Status varchar(50), SubmissionId int, SubmissionTypeId int)
insert into ##Table1(Id, Status, SubmissionId, SubmissionTypeId)
select 1 ,'Status1' ,1 , 1
union select 2,'Status2',1, 2
CREATE TABLE ##Table2 (ID int, Value varchar(50))
insert into ##Table2 (ID, Value)
select 1, 'Value1Table2'
CREATE TABLE ##Table3 (ID int, Value varchar(50))
insert into ##Table3 (ID, Value)
select 1, 'Value1Table3'
select ds.* from ##Table1 ds
left join ##Table2 di
on ds.SubmissionId = di.Id and ds.SubmissionTypeId = 2
left join ##Table2 dr
on ds.SubmissionId = dr.Id and ds.SubmissionTypeId = 1
where SubmissionTypeId in (1,2)
我在x.DefaultIfEmpty()中尝试使用y中的x进行了几次迭代,我无法在正确的位置设置where子句。我需要使用Table1启动查询,因为这是值的来源。
作为一种解决方法,我将查询分成两部分,然后将状态数据按顺序添加到列表中,但似乎必须有更好的方法。
谢谢。
答案 0 :(得分:2)
我认为您的SQL的直接翻译如下所示:
var q = from ds in table1
where ds.SubmissionTypeId == 1 || ds.SubmissionTypeId == 2
from di in table2
from dr in table2
where (ds.SubmissionTypeId == 2 && ds.SubmissionId == di.Id)
|| (ds.SubmissionTypeId == 1 && ds.SubmissionId == dr.Id)
select ds;
然而,这似乎不太可能是你想要的。如果我可以猜测你的逻辑是什么,我想你想要更像这样的东西:
var q = from ds in table1
where (ds.SubmissionTypeId == 2 && table2.Any(di => ds.SubmissionId == di.Id))
|| (ds.SubmissionTypeId == 1 && table3.Any(dr => ds.SubmissionId == dr.Id))
select ds;