Метод включения в LINQ используется для левого соединения?
Я использую Entity Framework 6, DotConnect для Oracle, и у меня есть эти 2 запроса:
Первый, используя простое соединение (LINQ и Output SQL):
LINQ:
var joinQuery = Db.Products
.Join(Db.Product_Categories.AsEnumerable(), p => p.ProductID,
pc => pc.CategoryID, (pc, p) => new { pc, p })
.ToList();
Выходной SQL:
SELECT * FROM Products
Во-вторых, используя Включить:
LINQ:
var includeQuery = Db.Products.Include("Product_Categories").ToList();
Выходной SQL:
SELECT * FROM Products
LEFT OUTER JOIN Product_Categories
ON Products.CategoryID = Product_Categories.CategoryID
Я сомневаюсь, что всегда смогу использовать метод "Включить" для левых соединений. Этот метод не понятен для меня.
1 ответ
В первом примере у соединения не должно быть.AsEnumerable() в конце. Делая это, вы заставляете EF идти и получать все записи из Product_Categories, а затем выполняете объединение в памяти, что может быть очень неэффективным, поскольку оно не использует какой-либо индекс.
Второй вариант у вас не чистый LINQ. Включить - это метод расширения, специфичный для EF, который недоступен другим поставщикам.
Так что, если вам нужен общий LINQ, вы можете использовать его с другими поставщиками БД, перейдите к варианту 1. Если вы хотите более простой синтаксис и согласитесь с тем, чтобы быть специфичным для EF, вариант 2 может быть лучше.