Когда синтаксическое выражение запроса LINQ написано с помощью DBContext, компилятор С# делает свою обычную магию преобразование синтаксиса запроса в синтаксис точек/расширений, используя его список 18 правил преобразования/срока перезаписи. Затем, когда запрос выполняется, EF применяет собственные внутренние правила перезаписи для создания выражения SQL.
Как и в статье, приведенной выше, я хотел бы иметь список правил перезаписи, применяемых EF. Где я могу это найти? Если я знаю правила перезаписи EF, я могу предсказать, что SQL EF будет генерировать для данного запроса, вместо того, чтобы ждать, пока время выполнения "увидит" сгенерированный SQL.
Например, рассмотрим следующие два запроса:
var result = from c in context.Customers
from a in c.Accounts
where c.ID > 2
select a;
var result = from c in context.Customers
where c.ID > 2
from a in c.Accounts
select a;
Когда компилятор С# заканчивает свои собственные правила перезаписи, вышеупомянутые запросы преобразуются в точечные обозначения со следующими соответствующими форматами:
SelectMany(...).Where(...).Select(...); //for the first query
Where(...).SelectMany(...); // for the second query
После этих преобразований EF начинает работать, применяя свои собственные правила перезаписи. Но EF имеет одну нормализованную форму для обоих вышеперечисленных запросов. Другими словами, оба запроса будут давать одинаковые результаты; либо запрос генерирует следующий оператор SQL:
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
[Extent1].[Stat_ID] AS [Stat_ID]
FROM [dbo].[Customers] AS [Extent1]
INNER JOIN [dbo].[Accounts] AS [Extent2] ON [Extent1].[ID] = [Extent2].[Customer_ID]
WHERE [Extent2].[ID] > 2
Не зная правил перезаписи EF, я не мог этого предсказать. Мне просто пришлось выполнить и отладить код, чтобы сделать это наблюдение.
Итак, где я могу найти список правил перезаписи, применяемых EF?
Мне также интересно, какую стратегию реализации EF применяют для применения правил. Вот статья, в которой обсуждаются несколько стратегий переписать правила. Возможно, я мог бы это обнаружить, изучая исходный код EF, но, что я делаю, но я еще не там.