Конвертировать SQL-запрос в Linq (содержит левые объединения) - PullRequest
1 голос
/ 15 января 2011

У меня есть запрос, который отлично работает в SQL, но у меня самое ужасное время, чтобы преобразовать его в linq.Таблица (таблица 1 ниже) содержит изменения статуса для нескольких типов записей.Для создания соединения требуется установить два поля: A 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)

IЯ пробовал пару итераций, используя в x от y в x.DefaultIfEmpty (), и я не могу установить предложение where в нужном месте.Мне нужно начать запрос с Таблицы 1, поскольку именно отсюда поступают значения.

В качестве обходного пути я разделил запрос на две части и просто последовательно добавил данные о состоянии в список, но, похоже, тамдолжно быть лучше.

Спасибо.

1 Ответ

2 голосов
/ 15 января 2011

Я думаю, что прямой перевод вашего 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...