Linq to sql объединить с несколькими фильтрами «ИЛИ» - PullRequest
0 голосов
/ 11 января 2019

Мне нужно реализовать это в Linq-to-sql

SELECT DISTINCT c.*
FROM dbo.Collector_Capital_Equipment c
LEFT OUTER JOIN dbo.Lab_Space s ON c.Room = s.Entry_Bar_Code 
                                OR c.HomeRoom = s.Entry_Bar_Code
WHERE s.id = 1021645 

Все исследования, которые я провел по этому вопросу, говорят о том, что linq-to-sql не может поддерживать множественное объединение "ИЛИ", и вместо этого предлагается сделать два соединения следующим образом:

SELECT DISTINCT c.*
FROM dbo.Collector_Capital_Equipment c
LEFT OUTER JOIN dbo.Lab_Space s ON c.Room = s.Entry_Bar_Code 
LEFT OUTER JOIN dbo.Lab_Space s2 ON c.HomeRoom = s2.Entry_Bar_Code
WHERE s.id = 1021645 

На самом деле это не один и тот же запрос, поскольку они будут возвращать разные результаты. Если не считать простой исходный код SQL в моей программе на C #, есть ли способ выполнить вышесказанное?

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Давайте начнем с начала. Если вы используете WHERE со столбцом из таблицы OUTER JOIN, это означает, что ваш запрос:

SELECT DISTINCT c.*
FROM dbo.Collector_Capital_Equipment c
LEFT OUTER JOIN dbo.Lab_Space s ON c.Room = s.Entry_Bar_Code 
                                OR c.HomeRoom = s.Entry_Bar_Code
WHERE s.id = 1021645 

логически эквивалентно:

SELECT DISTINCT c.*
FROM dbo.Collector_Capital_Equipment c
JOIN dbo.Lab_Space s 
  ON c.Room = s.Entry_Bar_Code 
  OR c.HomeRoom = s.Entry_Bar_Code
WHERE s.id = 1021645;

И этого можно достичь с помощью CROSS JOIN (псевдокод):

var q = from c in Collector_Capital_Equipment
       from s in Lab_Space
       where s.id == 1021645 
          && (s.Entry_Bar_Code == c.Room || c.HomeRoom == s.Entry_Bar_Code)
       select ...

Я предполагаю, что вы действительно хотите сгенерировать запрос:

SELECT DISTINCT c.*
FROM dbo.Collector_Capital_Equipment c
LEFT OUTER JOIN dbo.Lab_Space s 
  ON (c.Room = s.Entry_Bar_Code OR c.HomeRoom = s.Entry_Bar_Code)
  AND s.id = 1021645

который может быть представлен как:

SELECT c.*
FROM dbo.Collector_Capital_Equipment c
LEFT OUTER JOIN dbo.Lab_Space s 
  ON c.Room = s.Entry_Bar_Code AND s.id = 1021645
INTERSECT
SELECT c.*
FROM dbo.Collector_Capital_Equipment c
LEFT OUTER JOIN dbo.Lab_Space s 
  ON c.HomeRoom = s.Entry_Bar_Code AND s.id = 1021645

И выше запрос может быть выполнен с помощью LINQ с использованием операторов набора.

db <> fiddle demo

0 голосов
/ 12 января 2019

Я не думаю, что когда-либо видел, чтобы кто-то ранее использовал оператор OR в объединении. MS SQL Server даже поддерживает это в SQL?

Честно говоря, я бы просто разделил это на два запроса.

SELECT entry_bar_code 
FROM dbo.Lab_Space WHERE id = 1021645;

В результате того, что это подается в

SELECT DISTINCT * 
FROM dbo.Collector_Capital_Equipment 
WHERE c.room == <barcode> OR c.homeRoom == <barcode>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...