Имеет ли значение, где вызывается AsNoTracking в Entity Framework

имеет ли значение, где вызывается метод AsNoTracking при написании запроса Entity Framework? например,

var matchingCustomers = context.Customers.AsNoTracking().Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).ToList();
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").AsNoTracking().Skip(50).Take(100).OrderBy(n => n.Name).ToList();
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).AsNoTracking().Take(100).OrderBy(n => n.Name).ToList();
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).AsNoTracking().OrderBy(n => n.Name).ToList();
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).AsNoTracking().ToList();
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).ToList().AsNoTracking();

мне нравится добавлять его в конце заявления, но до список называется так:

var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).AsNoTracking().ToList();

2 ответов


нет, это не имеет значения: (источник)

новый запрос с NoTracking применяется, или исходный запрос, если NoTracking не поддерживается.

таким образом, вы либо делаете это в начале, и вы расширяете "новый" запрос с цепочкой методов, либо вы делаете это в конце, а затем получаете "новый" запрос. До тех пор, пока вы называете это перед выполнением запроса ты в порядке.


думаю, что

var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).ToList().AsNoTracking();

имеет значение, потому что вы пытаетесь применить NoTracking к структуре данных, уже находящейся в памяти, как только EF выполнил и обработал запрос.

когда вы используете этот fluent API; вы определяете запрос без его выполнения, пока вы, конечно, не выполните запрос. ToList() выполнит запрос и приведет данные в память, чтобы преобразовать его в List<T> структуры данных.

давайте разделим команду, чтобы понять это:

  • контексте.Клиенты -- > Выберите [ * ] от клиентов
  • где (n => n.city = = "Milan") -- > выберите [*] у клиентов, где город = = "Милан"
  • пропустить(50).Take (100) --> Select [*] from Customers where city = = 'Milan' СМЕЩЕНИЕ 50 СТРОК ПОЛУЧИТЬ СЛЕДУЮЩИЕ 100 СТРОК ТОЛЬКО
  • имя OrderBy -- > выберите [*] из клиентов, где city = = 'Milan' Смещение 50 строк получить следующие 100 строк только порядок по имени
  • ToList () -- > выполнить запрос и вывести данные в память с отслеживанием по умолчанию!
  • AsNoTraking () -- > ничего не делает, потому что EF уже выполнил запрос и отследил данные.