我有一个在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开始查询,因为那是值的来源。
作为一种变通方法,我将查询分为两部分,只是将状态数据顺序添加到列表中,但是看来必须有更好的方法。
谢谢你。
我认为您的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;