Ситуация: Скажем, мы выполняем запрос LINQ, который объединяет два списка в памяти (поэтому не требуется генерация DbSets или SQL-запроса), и этот запрос также содержит предложение where
.Этот where
фильтрует только свойства, включенные в исходный набор (часть запроса from
).
Вопрос: Оптимизирует ли интерпретатор запросов linq этот запрос, поскольку он сначала выполняет where
до того, как он выполняет join
, независимо от того, пишу ли я where
до илипосле join
?- поэтому он не должен выполнять объединение элементов, которые в любом случае не будут включены позже.
Пример: Например, у меня есть список categories
, к которому я хочу присоединиться с products
список.Тем не менее, меня просто интересует category
с ID
1. Выполняет ли интерпретатор linq внутри себя те же самые операции независимо от того, пишу ли я:
from category in categories
join prod in products on category.ID equals prod.CategoryID
where category.ID == 1 // <------ below join
select new { Category = category.Name, Product = prod.Name };
или
from category in categories
where category.ID == 1 // <------ above join
join prod in products on category.ID equals prod.CategoryID
select new { Category = category.Name, Product = prod.Name };
Предыдущее исследование: Я уже видел этот вопрос , но автор ОП заявил , что его / ее вопрос касается только случаев, не связанных с памятьюс сгенерированным SQL.Я явно заинтересован в том, чтобы LINQ выполнил объединение двух списков в памяти.
Обновление: это не дубликат "Выполнения заказа по запросу цепочки linq" , поскольку этот вопрос явно упоминаетсяотносится к dbset, и мой вопрос явно касался сценария не-db.(Более того, хотя это и похоже, я не спрашиваю здесь о включениях, основанных на навигационных свойствах, а о «соединениях».)
Обновление 2: хотя и очень похоже, оно также не является дубликатом «Это порядокпредикат важен при использовании LINQ? ", так как я явно спрашиваю о ситуациях в памяти, и я не могу видеть ссылочный вопрос, явно обращающийся к этому случаю.Более того, этот вопрос устарел, и я на самом деле заинтересован в linq в контексте .NET Core (которого не было в 2012 году), поэтому я обновил тег этого вопроса, чтобы отразить этот второй момент.
Обратите внимание: С этим вопросом я нацелен на то, будет ли интерпретатор запросов linq каким-либо образом оптимизировать этот запрос в фоновом режиме, и надеюсь получить ссылку на фрагмент документации или исходный код, который показывает, как это происходитсделано linq.Я не заинтересован в таких ответах, как "это не имеет значения, поскольку производительность обоих запросов примерно одинакова".