Is the search/loading of these records done directly at the base table level or is a first search done on the dbset?
Это делается на «уровне базовой таблицы» на сервере базы данных, получая результаты непосредственно из запроса, а затем DataContext возвращает любую существующую сущность, которую он уже отслеживал, и создает новые объекты, если у них нет дорожки для этих записей.
And then we complete and retrieve the records that are not yet tracked/in the dbset?
DataContext создаст новые сущности для этих записей и будет отслеживаться, если вы не указали явно AsNoTracking.
In other words what is the path of the loading of these elements?
То, как он работает с этого документа , заключается в том, что когда вы делаете запрос LINQ следующим образом:
from x in db.Products select x
Он генерирует выражение LINQ и затем передайте это выражение поставщику базы данных, чтобы сгенерировать фактический запрос к базе данных, заданный c для механизма базы данных, для которого он создан (возможно, не весь запрос скомпилирован, поэтому часть запроса может быть вычислена со стороны приложения.)
Затем он выполнит запрос и получит результат из этого запроса, а если запрос выполнен с отслеживанием, то он вернет любой существующий объект, который уже отслежен DataContext, и создаст новые объекты, если нет.
Объект и запись будут связаны ключом, и когда есть какая-либо часть запроса, использующая Keyless Entity Type, весь запрос будет выполнен как запрос NoTracking.
Обратите внимание, что если запись базы данных для такой существующей сущности изменилась, она не будет обновлять значения в существующей сущности, вам придется вручную перезагрузить эту сущность следующим образом:
db.Entry(product).ReloadAsync();