Метод включения в 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 может быть лучше.

Другие вопросы по тегам