Я использую Entity Framework и Linq to Entities с коннектором MySQL ADO.Net для доступа к базе данных MySQL.
Существует две таблицы «Запросы» и «Представления» с отношением «один ко многим» от «Запросы к представлениям».Соответственно, таблица Submissions содержит столбец RequestId, который зависит от внешнего ключа от Requests.
Мне нужно получить все запросы, в которых его представления содержат определенное значение.В LINQ я могу сделать это одним из двух способов:
var r1 = foo.Submissions.Where(s => s.FieldName == "foo" && s.FieldValue == "bar").Select(s => s.Request).Distinct();
var r2 = foo.Requests.Where(r => r.Submissions.Any(s => s.FieldName == "foo" && s.FieldValue == "bar"));
, который оценивается как
SELECT `Distinct1`.*
FROM
(SELECT DISTINCT `Extent2`.*
FROM `Submissions` AS `Extent1` INNER JOIN `Requests` AS `Extent2` ON `Extent1`.`RequestId` = `Extent2`.`RequestId`
WHERE ("foo" = `Extent1`.`FieldName`) AND ("bar" = `Extent1`.`FieldValue`))
AS `Distinct1`
SELECT `Extent1`.*
FROM `Requests` AS `Extent1`
WHERE EXISTS
(SELECT 1 AS `C1`
FROM `Submissions` AS `Extent2`
WHERE (`Extent1`.`RequestId` = `Extent2`.`RequestId`) AND ((@gp1 = `Extent2`.`FieldName`) AND (@gp2 = `Extent2`.`FieldValue`)))
Теперь первый стиль запроса использует INNER JOIN ... теперь он менее эффективенчем второй выбор?