Как конвертировать Linq в Sql? - PullRequest
0 голосов
/ 05 января 2019

Я хочу написать код для таблицы, я знаю в SQL Server, но я не знаю Linq или EF.

Код SQL Server:

SELECT *
FROM Driver
WHERE id IN (SELECT Driver
             FROM Drive_Car
             WHERE Drive_Car.Finish_Date IS NOT NULL)

Я написал этот код в EF, но он не соответствует результатам SQL Server:

var drivers = db.Drivers
                .Where(d => db.Drive_Car
                              .Where(dc => dc.Driver == d.ID && dc.Finish_Date != null)
                              .Select(dc => dc.Driver)
                              .Contains(d.ID));

Ответы [ 2 ]

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

Этого должно быть достаточно:

var drivers = db.Drivers
                .Where(d => db.Drive_Car
                              .Any(dc => dc.Driver == d.ID && dc.Finish_Date != null));

Это приводит к Exists, что в итоге примерно соответствует подходу IN. Дублирование строк с помощью объединения и открепление их обратно через distinct не всегда оптимизируется, и вы можете получить больше накладных расходов, чем необходимо, поэтому я бы не предпочел такой способ.

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

Вы можете получить тот же результат, используя операцию соединения. Или разделить команду на 2 части.

SQL-подобный синтаксис Linq:

var query =
   (from d in db.Driver
   join dc in dc.Drive_Car on dc.Driver equals d.ID
   where dc.Finish_Date != null
   select d).Distinct();

Другой метод (разделить на 2 части)

var lst =
   (from dc in dc.Drive_Car 
   where dc.Finish_Date != null
   select dc.Driver).Distinct().ToList();

var query =
   (from d in db.Driver
    where lst.Contains(d.ID)
   select d);

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...