Linq To Objects - под капотом объединений

Я хотел бы знать, каковы различия между этими двумя выражениями linq?

Что быстрее?

Являются ли они одинаковыми?

В чем разница между этим утверждением

from c in categories
from p in products
where c.cid == p.pid
select new { c.cname, p.pname };

и это утверждение?

from c in categories
join p in products on c.cid equals p.pid
select new { c.cname, p.pname };

Спасибо заранее, ребята.

EDIT: в контексте LINQ to Objects

Ответ 1

Хорошо, в LINQ to Objects разница может быть очень драматичной.

Первая форма рассматривает каждую пару c и p, проверяет на c.cid равную p.pid и дает совпадения.

Вторая форма (внутри Join) сначала создает хэш-поиск от pid до соответствия элементам Product. Затем он передает categories, а затем проверяет каждую категорию, в которой есть соответствующие элементы Product в поиске, основанные на c.cid. Это, как правило, гораздо более эффективно, так как нужно только просмотреть products один раз и создать хэш-поиск. С другой стороны, он имеет больший объем памяти. Все это делается несколько лениво, конечно, только тогда, когда вы просите первый результат, что что-то существенное происходит.

Подробнее об операции Join см. в разделе блога Edulinq по теме.